3

文字列(bar)の前に2つの文字列(foo)または(boo)がすぐに続かない検索を実行しようとしています。

例えば

foo=bar一致してはいけません

foo=baz bar一致する必要があります

bar一致する必要があります

boo=bar一致してはいけません

正規表現の背後にある外観はこれに最適だったと思います。(?<!ただし、MSVC ++から使用しようとすると、処理されない例外が発生します。

アサーションは?でサポートされていますか?構文的に違いますか?または、誰かがこの正規表現を作成したり、動作をエミュレートしたりするのを手伝ってくれませんか?

4

2 に答える 2

2

Boost.RegexまたはBoost.Xpressiveの使用を検討してください。MSVC ++ 10の正規表現の実装は完了していませんが、Boostの(正規表現とXpressiveの両方)は完了しています。どちらにも長所と短所があります。

Xpressiveは、コンパイル時の正規表現のコンパイルにより高速であり、正規表現の構文チェックが優れていますが、多くのシンボルを作成する傾向があるため、少なくとも数メガバイトの増加したデバッグ情報を確認しています。

正規表現は高速であり、正規表現の構築に演算子を表現的に使用する必要はありません。ただし、ライブラリでリンクする必要があります。

perl正規表現を実行できる他のC++正規表現エンジンがありますが、Boostの使用は非常に簡単で、何を投げても問題はありません。

于 2012-10-12T03:08:21.577 に答える
1

無制限の後読みをサポートする正規表現フレーバーは多くありませんが、それらはすべて無制限の先読みをサポートします。

文字列を反転し、先読みを使用して再度反転することができます。ただし、これは大きな文字列ではコストがかかります。

限定後読みを使用できる場合があります。一部の正規表現フレーバーは、正確な長さまたは最大長がわかっている場合、後読みをサポートします。

後読みなしで文字列全体を見つけてから、いくつかの一致を手動で破棄することができます。オーバーラップが問題にならない場合は、後読みをオプションのキャプチャ グループに変更し、キャプチャ グループが一致した一致を破棄できます。肯定的な後読みを置き換える場合、オプションのキャプチャ グループは、オプションでもキャプチャ (グループでもない) である必要はありません。

于 2012-10-12T03:14:44.260 に答える