0

のようなエスケープされた文字列に一致する正規表現を構築しようとしています@"hello""world"。これまでのところ私は持っています(空白を無視してください):

@(?=")"   #at sign if followed by double quote then double quote          
(?>       #atomic
    ""              
  |
    [^"]                             
)*
"

問題は、無効な (閉じられていないため) 文字列が@"""として一致すること@""です。アトミック グループ化、別名非バックトラッキング部分式を使用(?>""|[^"])*すると、最後の 2 つの二重引用符に一致し@"""(左の代替が 2 つの二重引用符に一致する可能性があるため)、必要に応じて全体的な一致が失敗する ("正規表現の最後の部分が一致しないため) と考えました。存在します) しかし、グループは十分に貪欲ではないように見えます (貪欲な量指定子と原子グループ化がありますが)正規表現が失敗したことに気付くとすぐに、正規表現の*最初の後にポイントに戻ります. "回避策は正規表現の最後に置くことです(?!")が、アトミックグループ化で機能しない理由を知りたいです。

4

1 に答える 1

1

問題

アトミック グループが最後の 2 つの引用符と一致しません! マッチングは常に左から始まります。バックトラッキングが必要な場合 (トークンが一致しないため)、デフォルトで最後のトークンがポップバックされます。しかし、アトミック グループを使用すると、グループの最後のトークンだけではなく、グループ全体がポップバックされました。これは、壊滅的なバックトラッキングを回避するために使用されます。

解決

最後に文字列の終わりを置きます。

@(?=")"(?>""|[^"])*"$
于 2012-08-31T14:13:14.890 に答える