2016-12-20 3 views
0

this regexでは、ミリ秒(ms)フィールドの有無に合わせて時間を合わせたいと思います。完全を期すために、私は(私は複数行を有効にするためにregex101にアンカーを削除)ここで正規表現を記述します。C++ 11:2つの可能な一致数の正規表現を使って安全に練習する

^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:|(?:\.)([0-9]{1,6}))$ 

私は一種のこののC++の挙動を理解していません。 regex101では、キャプチャグループの数は文字列に依存しています。 msがない場合は3 + 1です(C++は一致するパターンにmatch [0]を使用するため)、msがある場合は4 + 1です。しかし、この例では:

std::regex timeRegex = std::regex(R"(^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:|(?:\.)([0-9]{1,6}))$)"); 
std::smatch m; 
std::string strT = std::string("12:00:09"); 
bool timeMatch = std::regex_match(strT, m, timeRegex); 
std::cout<<m.size()<<std::endl; 
if(timeMatch) 
{ 
    std::cout<<m[0]<<std::endl; 
    std::cout<<m[1]<<std::endl; 
    std::cout<<m[2]<<std::endl; 
    std::cout<<m[3]<<std::endl; 
    std::cout<<m[4]<<std::endl; 
} 

我々はm.size()は、ミリ秒のフィールドがあるかどうかに関係なく、常に5であることを参照してください! m[4]は、msフィールドがない場合は空の文字列です。この動作はC++の正規表現のデフォルト動作ですか?サイズを疑問に思った場合は、私は試してみるべきですか?私は...サイズさえもここでは少し誤解を招くことになります!

+0

あなたが求めていますか?あなたは全体のマッチ+パターンに定義された4つのキャプチャグループを持っているからです。グループが一致するかどうかにかかわらず、ECMAScript scpeごとに重要ではなく、空のグループには常に空の文字列があらかじめ設定されています。 –

+0

@WiktorStribiżew私が提供したregex101のリンクを確認してください。 msフィールドがない場合は、4 + 1ではなく3 + 1でなければなりません。 –

+0

私は気にしません、あなたとすべての使用はregex101が示しているかどうか気にするべきではありません、独自のバグがあります。重要なのは、コード内にあるものです。あなたは4つのキャプチャグループを定義しました - インデックス0での全試合のための各+1のための4つのスロットがあります。 –

答えて

3

m.size()は、常に式内にマークされた部分式の数に1を加えたものになります(式全体に対して)。

コードには、4つの部分式がマークされています。一致しているかどうかにかかわらず、mのサイズには影響しません。

あなたはミリ秒がある場合は、今、あなたがチェックすることができますしたい場合:

m[4].matched 
0

std::smatch(a.k.a.)は基本的にタイプstd::sub_matchの要素を保持するコンテナです。最初の要素は完全正規表現の一致結果で、後続の正規表現は各部分式の一致を保持します。あなたのパターンが4つのサブ式を持っているので、5つの結果が得られます(4 +完全一致)。

2
m.size();// Returns the number of match results. 
     // a string is allocated for each 'Capture Group' 
     // and filled with the match substring. 

smatchがたmatch_results

あるので

http://www.cplusplus.com/reference/regex/match_results/

サイズが数を返します(参照)正規表現に含まれるキャプチャグループの数に基づいてALLOCATEDにマッチします。

キャプチャグループ:

括弧グループ、それらの間の正規表現。彼らは、内部の正規表現でマッチしたテキストを番号付きのグループに取り込み、番号付きの逆参照で再利用することができます。彼らはあなたがグループ化された正規表現全体に正規表現演算子を適用することができます。

http://www.regular-expressions.info/refcapture.html

あなたのサイズは関係なく、あなたがregex_match(充填終わる何5)として割り当てられることになるだろうだから、なぜそれがあります。他の人はnotexを持っているので、5番目は完全一致です。

参照:すべてのすべてでは5つのグループがある理由 What does std::match_results::size return?

+0

これは役立ちます。私はそれを試しました。ありがとう:) –

関連する問題