0

正規表現を使用して、文字列内で開始区切り文字と終了区切り文字に適合する最小のシーケンスを探します(エスケープ文字を考慮に入れます)。たとえば、次の文字列がある場合、最も低い一致を見つけて、一致[ two ][ four \[ five \] ]無視しながら、それらがに含まれているとし[ one ... three ... six]ます。

zero [ one [ two ] three [ four \[ five \] ] six ] seven

これまでのところ、次の正規表現があります。これは、ネガティブルックビハインドを使用してチェック]し、2番目の一致の最後を完全にキャッシュしていません。

(\[)(?:(?!(?:[^\\])\1|\]).)*]

私の目標は、単純なネストされたコマンドブロックを処理するために使用できる単純なパーサーを用意することです。

4

1 に答える 1

1

次の作品:

\[(?:\\[\[\]]|[^\[\]])*]

それが機能していることを確認してください:http ://www.rubular.com/r/cAajtm2wxw

説明:

\[                # opening bracket
(?:               # start of non-capturing group (repeat zero or more times)
   \\[\[\]]         # backslash followed by [ or ]
   |                # OR
   [^\[\]]          # any character except [ or ]
)*                # end of non-capturing group
]                 # closing bracket

バックスラッシュのような文字列ではバックスラッシュがエスケープされるため、これは完全に安全ではないことに注意してください[ one \\[ two ] three ]。したがって、前のバックスラッシュは[エスケープしないでください。

これを修正するには、次を使用できます。

\[(?:(?<!\\)(?:\\\\)*\\[\[\]]|[^\[\]])*]

これにより、元の正規表現の単一のエスケープ\\されたバックスラッシュが、奇数のバックスラッシュをチェックする次の正規表現に変更されます。

(?<!\\)           # fail if previous character is a backslash
(?:\\\\)*         # some even number of backslashes
\\                # one more backslash to make it odd

http://www.rubular.com/r/BhQzLQpyB9

于 2012-04-23T18:01:24.117 に答える