2012-03-15 1 views
5

私は、次の正規表現があります:[^\1]がilleagalあるので(["'])(\\\1|[^\1])+\1Java RegExpグループ否定は可能ですか?

明らかにそれはコンパイルすることができませんでした。

一致するグループを無効にすることはできますか?

+1

あなたが一致しようとしているテキストは何ですか?あなたの正規表現は少し混乱しています。 – beerbajay

+0

質問は他の味/言語でも可能ですか?キャプチャグループは複数の文字を含むことができるので、このような構造体は意味をなさないので、 '[^ \ 1]'はこれらの文字のリストになります...しかしこれは私の意見です。正規表現エンジンが予期する文字を事前に知る必要があるかもしれません。 '[\ 1]'は使えますか? –

+0

私は['regular-expression.info'](http://www.regular-expressions.info/brackets.html)でこれを見つけました:*"後方参照は文字クラス内では使用できません。 '(a)[\ 1b]'のような正規表現では大部分の正規表現のフレーバでは8進エスケープと解釈されるので、この正規表現は 'a'と' \ x01'または 'b'のいずれかにマッチします。正規表現の詳細を知りたいのですが、[* Mastering Regular Expressions * by Jeffrey Friedl](http://shop.oreilly.com/product/9780596528126.do)をお勧めします。 –

答えて

4

あなたは、正または負の文字クラスで後方参照を使用することはできません。

しかし、あなたが使用して、あなたが望むものを達成することができます負lookahead assertions

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

説明:

(["']) # Match and remember a quote. 
(?:  # Either match... 
\\.  # an escaped character 
|   # or 
(?!\1) # (unless that character is identical to the quote character in \1) 
.  # any character 
)*  # any number of times. 
\1  # Match the corresponding quote. 
+0

あなたは他の質問にはうまくいかないとコメントしました。 '([" '])(\\\ 1 |。)+?\ 1'は、左から右に交替するのではないでしょうか?それとも、ここで問題が見つからないのですか? JavaScript。 –

+0

@FelixKling:正しいですか?カッコを正しい場所に移動すると問題が解決します.Ademibanの回答を元に戻すことができるかどうかを確認してみましょう –

+0

あなたの解決策はバックトラックを避けるためにはまだまだ良いでしょう。 –

関連する問題