1

重複の可能性:
引用符で囲まれた文字列とエスケープされた引用符を一致させる方法は?

パーサーを作成していて、文字列に一致するメソッドが必要です: 文字列は . で始まり . で終わります"。エスケープされていない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 では正しく動作しません。

この正規表現を修正するのに長い時間を費やしましたが、方法がわかりませんでした。この質問には少し圧倒されるかもしれませんが、さらに情報が必要な場合はお知らせください。

4

1 に答える 1

1

これを試して:

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

Rubular のデモ: http://rubular.com/r/Ql9RQ4pex6

簡単な内訳:

"            # a quote
(            # start group 1
  \\[\\"]    #   an escaped quote or backslash
  |          #   OR
  [^\\"]     #   any char except a quote or backslash
)*           # end group 1 and repeat it zero or more times
"            # a quote
于 2012-11-03T19:27:05.957 に答える