2016-11-05 16 views
0

私の個人的なライブラリを開発しているうちに、私はlibstdC++ 6の中にエラーがあると考えました。エラーの妥当性確認

私は確かに、このライブラリは多くの高級熟練者によってレビューされていますので、ここで私の所見を検証し、さらなるステップを支援します。

は、次のコードを考えてみましょう:私は

  • プロトコル
  • ユーザー/パス(オプション)
  • ホスト
  • ポートにURLを解析する正規表現を書かれている

    #include <regex> 
    #include <iostream> 
    
    int main() 
    { 
         std::string uri = "http://example.com/test.html"; 
         std::regex reg(...); 
         std::smatch match; 
         std::regex_match(uri, match, reg); 
         for(auto& e: match) 
         { 
           std::cout<<e.str() <<std::endl; 
         } 
    } 
    

    を(オプション)

  • パス(オプション)
  • クエリ
  • (オプション)所在地(オプション)

私は(++ c)において、次の正規表現を使用:

std::regex reg("^(.+):\\/\\/([email protected])?([a-zA-Z\\.\\-0-9]+)(:\\d{1,5})?([^?\\n\\#]*)(\\?[^#\\n]*)?(\\#.*)?$"); 

これはオンラインテスタとMSVC++ 2015 Update 3の中では非常にうまくいきましたホスト部分がホストとパスの両方に一致するビルドホストでは失敗します。

Buildhost:

グラム++(Ubuntuの5.4.0-6ubuntu1〜16.04.2)5.4.0 20160609

のlibstdC++ 6:AMD64 5.4.0-6ubuntu1〜16.04.2

std::regex reg("^(.+):\\/\\/([email protected])?([a-zA-Z\\.0-9\\-]+)(:\\d{1,5})?([^?\\n\\#]*)(\\?[^#\\n]*)?(\\#.*)?$"); 

は、それが正常に動作します:私はこれに正規表現を変更した場合ので

は、私はこのエラーを検討しますそれはまったく同じように動作するはずです。

失敗正規表現:https://ideone.com/7n2JdK

作業する正規表現:https://ideone.com/6NMPUW

が、私はここで本当に重要な何かを欠場かこれはのlibstdC++ 6内のエラーですか?

唯一の違いは、char型のクラスである:

[a-zA-Z\\.\\-0-9] // not working 
[a-zA-Z\\.0-9\\-] // working 
+0

おそらく、2つの正規表現の違いを指摘したいと思いますか、誰もが文字を文字で比較することを期待していますか? –

+0

charでcharをチェックする必要はありません。これは明らかにバグです。 –

答えて

0

ハイフンがでエスケープされているので"[.\\-0]".または-(いずれかの文字にマッチする文字クラスとして解析しなければならないので、これは明らかにバグですリテラル\)または0です。未知の理由のために、ハイフンは範囲演算子として解析され、[a-zA-Z\\.\\-0-9]+部分式は[a-zA-Z.-0-9]+に等しくなります。 this regex demoを参照してください。

2番目の式は、文字クラスの最後(および開始時)の-が常にリテラルハイフンとして解析されるために機能します。

同じバグの別の例:[$\-&]正規表現が%と一致してはならない

std::string uri = "%"; 
std::regex reg(R"([$\-&])"); 
std::smatch match; 
std::regex_match(uri, match, reg); 
for(auto& e: match) 
{ 
    std::cout<< e.str() <<std::endl; 
} 

、それは$-または&と一致する必要がありますが、何らかの理由で、%(のためにそれが$&での間にありますASCIIテーブル)is still matched

+0

次に何をするのですか? このバグはどこで解決できますか? – Thalhammer

+0

文字クラスの先頭または末尾に常にハイフンを置くことができます。 –

+0

もちろん、このバグは修正されるべきではありませんか? – Thalhammer

0

これはバグではないと感じますが、これは基本的なRE仕様と関係があります。

-(ハイフン)、、特にのようなものを照合する必要がある場合は、その具体的な内容を知っておく必要があります。 quothがre_format(7)(最初の文):

それ最初または最後の文字、または範囲の第2のエンドポイントにし、リテラル -を含めるには。リテラル-を最初の末尾として使用するには、 の範囲のポイントを[..]に入れて、照合要素にします(下記参照)。 を除いて、[(次の段落を参照)を使用するいくつかの組み合わせでは、\を含む他のすべての特殊文字は、括弧の中で という特別な意味を失います。

e.e.e.ハイフンをエスケープし、それが文字として一致することを期待するのは、まさにマニュアルページのものではなく、リテラルハイフンにマッチさせる方法です。

+0

を参照してください。これはPOSIX正規表現フレーバに関連していますが、[default std :: regex flavor ECMAScript](http://www.cplusplus.com/reference/regex/) 。それがPOSIXの場合、正規表現はバックスラッシュパターンとして解析されますが、失敗します(http://coliru.stacked-crooked.com/a/adb3d3c3635dd74a)。 "基本的なRE仕様"のようなものはありません。正規表現のフレーバーが多くあり、POSIXは正規表現のフレーバータイプの1つです。 –