1

区切り記号 ( \") を 1 文字として扱う正規表現を作成しようとしています。

次のコードは正常にコンパイルされますが、rgx を初期化しようとすると終了し、Abort trap: 6libc++ を使用してエラーがスローされます。

std::regex rgx("[[.\\\\\".]]");
std::smatch results;
std::string test_str("\\\"");
std::regex_search(test_str, results, rgx);

を削除すると[[. .]]、正常に動作し、意図したとおりにresults[0]戻り\"ますが、前述のように、このシーケンスを文字クラスとして使用できるようにしたいと考えています。

編集: わかりました、照合シーケンスの以前の理解が間違っていたことに気付きました。それが機能しない理由は\\\\\"、シーケンスとして定義されていないためです。だから私の新しい質問: 照合されたシーケンスを定義することは可能ですか?

4

1 に答える 1

1

だから私はどこが間違っていたのかを理解し、誰かが偶然出くわした場合に備えて、これをここに残しておくと思いました.

で文字の受動的なグループを指定(?:sequence)して、文字クラスと同様に量指定子を適用できます。おそらく、私が最初に尋ねたものとは正確には異なりますが、少なくとも私の場合は同じ目的を果たします。

二重引用符で始まり二重引用符で終わる文字列 (結果にこれらの文字を含む) を一致させ、文字列内で区切り引用符を使用できるようにするには、次の式を使用しました。

\"(?:[^\"^\\\\]+|(?:\\\\\\\\)+|\\\\\")*\"

これは、文字が引用符またはバックスラッシュでない場合、できるだけ多くの文字を取得することを示しています。これが一致しない場合は、最初に偶数のバックスラッシュ (この文字の区切りを許可するため) との一致を試みます。クォーテーションマーク。この非キャプチャ グループは、 に達したときにのみ停止し、可能な限り何度でも一致し\"ます。

これの効率についてはコメントできませんでしたが、間違いなく機能します。

于 2013-01-06T20:07:02.970 に答える