1

(またはそう思う)...

何かを解析するための正規表現エンジンとしてboost::xpressiveを使用していると、セグメンテーション違反が発生します。gdbは300を超えるスタックフレームを表示するため、再帰性と私の悪い正規表現が原因であると思われます。だから、これが私の(大文字と小文字を区別する)正規表現で、perl /python表記法です:

begin([^e]+)e((?:[^b]|b(?!egin))+)

私は一致することを期待しています

beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin

最初のグループに最初の大文字のテキスト(HEADER HERE)があり、2番目のグループに2番目の大文字のテキストがあります。グループ2に一致するはずのテキストが非常に長い場合、常にセグメンテーション違反が発生します。

なぜこれが機能しないのですか?

4

1 に答える 1

5

欲張りでないマッチングを使用するだけで、正規表現を大幅に簡略化できます。

begin(.+?)e(.+?)begin

それを試して、それがうまく機能するかどうかを確認してください。

正規表現の-またはグループ化の再帰的な実装が原因で、元の正規表現がスタックオーバーフローを引き起こしていた可能性があります|。これは、2番目のグループのすべての文字で分岐する可能性があります。

.+?一方、単純な非欲張りは、すべての文字に対して分岐する必要はありません。

于 2012-03-05T09:15:57.083 に答える