2012-04-23 17 views
0

regexを使用して、開始と終了の区切り文字(エスケープ文字を考慮して)に合った最小の文字列を探したいと思います。たとえば、次の文字列がある場合は、[ two ][ four \[ five \] ]という最も低い一致を見つけたい場合は、一致を無視して、それらは[ one ... three ... six]に含まれています。regexを使って入れ子になったマッチを解析する

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

は、これまでのところ私は、負のルック尻をチェックするために使用すると、非常に第二試合の最後の]をキャッシュされていない、次の正規表現を持っています。

(\[)(?:(?!(?:[^\\])\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

+0

ありがとうございました!あなたは私が考えていない問題を予見するのを助けました。また、創造的なロジックの追加(2偶数+ 1奇数の前に1奇数を使用)はきれいです。 – Xeoncross

関連する問題