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++の正規表現のデフォルト動作ですか?サイズを疑問に思った場合は、私は試してみるべきですか?私は...サイズさえもここでは少し誤解を招くことになります!
あなたが求めていますか?あなたは全体のマッチ+パターンに定義された4つのキャプチャグループを持っているからです。グループが一致するかどうかにかかわらず、ECMAScript scpeごとに重要ではなく、空のグループには常に空の文字列があらかじめ設定されています。 –
@WiktorStribiżew私が提供したregex101のリンクを確認してください。 msフィールドがない場合は、4 + 1ではなく3 + 1でなければなりません。 –
私は気にしません、あなたとすべての使用はregex101が示しているかどうか気にするべきではありません、独自のバグがあります。重要なのは、コード内にあるものです。あなたは4つのキャプチャグループを定義しました - インデックス0での全試合のための各+1のための4つのスロットがあります。 –