でのapperanceのために一度だけの部分式を保持し、私は次のコードを持っている:は、C++のstd ::正規表現、smatchは、パターン文字列
int main()
{
regex reg_expr("(\\([A-Z],[A-Z]\\))(?:\\s(\\([A-Z],[A-Z]\\)))*");
//regex reg_expr("(\\([A-Z],[A-Z]\\))(?:\\s(\\([A-Z],[A-Z]\\)))*\\s(\\([A-Z],[A-Z]\\))");
smatch sm;
string input("(A,B) (C,D) (F,W) (G,K) (R,M)");
//string input("(A,B) (C,D) (F,W)");
if (regex_match(input, sm, reg_expr)) {
cout << "true\n";
cout << sm.size() << "\n";
for (int i = 0; i < sm.size(); i++) {
//if (sm[i].length())
cout << "submatch number " << i << ": " << sm[i].str() << '\n';
}
} else
cout << "false";
return 0;
}
すべてが「smatch SM」は各部分式のための唯一の部分文字列を持っていることを除いて正常に動作します正規表現の文字列で指定します。 たとえば、次のテスト文字列のために:
(A,B) (C,D) (F,W) (G,K) (R,M)
正しく
(\([A-Z],[A-Z]\))(?:\s(\([A-Z],[A-Z]\)))*
正規表現と照合され、「SMは」唯一の木の部分文字列を持っている:1は、文字列全体のためであり、 「(C、D)」、「(F、W)」、「(G、K)」は欠落しているが、一致している(「(A、B)」と「(R、M) 。
(?:\s(\([A-Z],[A-Z]\)))*
は正規表現によって0個以上の部分式が一致するはずですが、std::smatch sm
には1つの部分式しか格納されないというエラーがあるようです。
ライブラリーのエラー(これはあまりありません)か、私は何か間違っていますか?あなたの助けと助言はうまくいっています!
これはキャプチャの仕組みではありません。獲得されたグループ値ではなく、複数の一致*を収集するには、正規表現イテレータで簡単な 'R '(\([A-Z]、[A-Z] \))' 'を使用する必要があります。 –