3

この Java 正規表現は、2 つの括弧の間のすべてのテキストと一致すると予想されます。

%(.*?)\((.*?)(?!\\)\)

コメント付きで表示:

%(.*?)      # match all text that immediately follows a '%'
\(          # match a literal left-paren
(.*?)       # match all text that immediately follows the left-paren
(?!\\)      # negative lookahead for right-paren: if not preceded by slash...
\)          # match a literal right-paren

しかし、そうではありません(このテストで実証されているように)。

この入力の場合:

%foo(%bar \(%baz\)) hello world)

私は期待%bar \(%baz\)していましたが、見ました%bar \(%baz\(エスケープされた右括弧なし)。否定的な先読み構造の使用法が何らかの形で間違っていると推測しています。誰かが私の正規表現の問題を説明してもらえますか? ありがとう。

4

2 に答える 2

1

あなたも周りを見回す必要はありません。否定された文字クラス[^\\]を使用して、それをグループに含めるだけです。

%(.*?)\((.*?[^\\])\)
于 2012-07-21T04:46:11.923 に答える
1

私は問題を理解しました。実際に否定的な後読みが必要なときに、私は否定的な先読みを使用していました。

正規表現は次のようにする必要があります。

%(.*?)      # match all text that immediately follows a '%'
\(          # match a literal left-paren
(.*?)       # match all text that immediately follows the left-paren
(?<!\\)     # negative lookbehind for right-paren: if not preceded by slash...
\)          # match a literal right-paren

この修正については、こちらで説明しています。

于 2012-07-21T04:07:35.443 に答える