3

この C++ コードの一部が永久にブロックされるのはなぜですか?

string word = " a\n";
regex indent("^( |\t)*");
word = regex_replace(word, indent, "");

また、この C++ コードの一部がすぐに終了するのはなぜですか?

string word = " a\n";
regex indent("^( |\t)+");
word = regex_replace(word, indent, "");

さらにひねりを加えると、なぜこれはすぐに終了するのでしょうか?

string word = " a\n";
regex indent("^( |\t)+?");
word = regex_replace(word, indent, "");

私はそれ"^( |\t)+?""^( |\t)*"

libc++ と llvm および標準の c++ 正規表現ライブラリを使用しています。

4

3 に答える 3

3

私の推測では、^( |\t)*何も一致せず (つまり、* は 0 以上を意味するため、1 つのスペース、1 つのタブ、または空の文字列に一致します)、既存の (悪い) アルゴリズムでは、入力文字列に何も一致しません... 永遠に。つまり、その正規表現の実装でバグに遭遇したことになります。

于 2013-08-06T04:20:06.280 に答える
0

コードは問題ありません。正規表現ライブラリは、libc++ のバージョンではほとんど実装されていません。最善の策は、boost や libc++ の更新バージョンなどの別のライブラリを使用することです。

于 2013-08-06T04:06:34.223 に答える
0

libc++ のブリーディング エッジ バージョンをダウンロードしてコンパイルしましたが、その"^( |\t)*"バージョンはブロックされなくなりました。だから私はこれを古いライブラリにチョークするつもりです.

于 2013-08-06T04:25:19.730 に答える