2009-08-29 6 views
15

は、私のような文字列をしている:ここで何を一致させるNOT「うん、二重引用符の前にバックスラッシュが付いていない以外は何にもマッチする正規表現は何ですか?言い換えれば

私は引用符内のすべてのものと一致するにはどうすればよい

「\何は、二重引用符をエスケープ」。?

私は

^"((?<!\\)[^"]+)"

を考えています。しかし、私の頭には、スピン、それは正または負の後読みをすべきですか?それとも、全く?

動作しません

二重引用符を除いて、バックスラッシュを前に付けない文字はどのように一致させるのですか?

答えて

27

必要はありません後読み:

"([^"]|\\")*" 

ので:マッチ引用符、およびそれらの内部:引用符([^"]またはエスケープ引用符(\\")、任意に何回も(*)を除くすべての文字。

+4

カオスは、OPで指定されていないものの、ダブルバックスラッシュを別々に扱いたいと思うでしょう。 –

+0

ハァー、ここで私は再び問題を複雑にする。このような単純な解決策はまったく考えていませんでした。ありがとう! –

+1

私はおそらく '\\。'を使用します。バックスラッシュがバックスラッシュ、バックスラッシュ、(閉じる)二重引用符で混同されるのを防ぐために、バックスラッシュが任意の単一の後続の文字をエスケープできるようにします。明らかに、8進数または16進数のエスケープ、またはUnicodeエスケープを処理したい場合は、ドットの代わりにもっと複雑な式が必要です。 –

2

「先行しない」は「負のlookbehind」に直接変換されるため、(?<!\\)"が必要です。

ここであなたの日を傷つけるかもしれない質問があります。文字列"foo\\"はどうですか?つまり、2つのバックスラッシュの前にダブルクォートがあります。ほとんどのエスケープ構文では、2つ目のバックスラッシュの特殊な意味を最初に打ち消したい場合があります。

正規表現がパーサーの代わりでない理由は、そのようなものです。

+0

私はネガティブなlookbehindが私よりも高価です負の文字cを使用するソリューション喉と交替。これは、正規表現エンジンのための簡単なケースです。 –

+0

おそらく、そうです。 – chaos

+0

これはどうですか? '^"([^ "] |(?<!\\)\\") "' " –

関連する問題