パーサーを作成していて、文字列に一致するメソッドが必要です: 文字列は . で始まり . で終わります"
。エスケープされていない2 番目までのすべて"
が一致する必要があります。エスケープされているとは、その前に奇数のバックスラッシュがあることを意味します (例:\"
または\\\"
)。
いくつかの例では、前の部分=>
は入力であり、他の部分はメソッドが抽出するものです:
"Hello World" => "Hello World"
"Hello" World => "Hello"
"Hello \"World" => "Hello \" World"
"Hello \\" World => "Hello \\"
ほとんどのプログラミング言語では、文字列に実際のバックスラッシュを含めるには、バックスラッシュをエスケープする必要があると思います。つまり、文字列内で実際のバックスラッシュを 1 つ取得するには、2 つのバックスラッシュが必要になります。上記の例ではこれを無視しています。
私はこの正規表現を思いつきました(私はRubyを使用しています):
/
"
(?:
(?:\\{2})* # an even amount of backslashes
\\ # followed by a single backslash: odd amount of backslashes
"
|
[^"]
)*
"
/x
ただし、3 番目の例の文字列、またはエスケープするバックスラッシュを含む文字列では正しく機能しません"
。*
最後から 3 行目の を削除すると、作品がエスケープされることに気付きました"
が、例 4 では正しく動作しません。
この正規表現を修正するのに長い時間を費やしましたが、方法がわかりませんでした。この質問には少し圧倒されるかもしれませんが、さらに情報が必要な場合はお知らせください。