35

文字列を照合するには、Perl の正規表現が必要です。二重引用符で囲まれた文字列のみを想定しています。\" はリテラルの引用文字であり、文字列の末尾ではなく、\ はリテラルのバックスラッシュ文字であり、引用文字をエスケープしてはなりません。明確でない場合は、例:

"\""    # string is 1 character long, contains dobule quote
"\\"    # string is 1 character long, contains backslash
"\\\""  # string is 2 characters long, contains backslash and double quote
"\\\\"  # string is 2 characters long, contains two backslashes

これら 4 つの可能性すべてと、それらの可能性のその他すべての単純なバリエーションを有効な文字列として認識できる正規表現が必要です。私が今持っているものは次のとおりです。

/".*[^\\]"/

しかし、それは正しくありません。最初のもの以外には一致しません。これを処理する方法について、誰かが私に正しい方向へのプッシュを与えることができますか?

4

7 に答える 7

43

/"(?:[^\\"]|\\.)*"/

これは Cal の回答とほぼ同じですが、. などのエスケープ コードを含む文字列に一致するという利点があります\n

文字は、含まれている式が後方参照として保存されるの?:を防ぐためにありますが、削除することができます。

注: Louis Semprini が指摘したように、これは Perl の正規表現エンジンに組み込まれている再帰制限により 32kb のテキストに制限されています (残念ながらヒットすると、大声でクラッシュするのではなく、黙って失敗を返します)。

于 2009-01-26T22:09:36.457 に答える
26

これはどう?

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

スラッシュまたは引用符ではない 0 個以上の文字、または 2 つのスラッシュ、またはスラッシュと引用符に一致します

于 2009-01-26T20:53:24.257 に答える
9

一般的な解決策(すべてのバックスラッシュ文字に一致):

/ \A "               # Start of string and opening quote
  (?:                #  Start group
    [^\\"]           #   Anything but a backslash or a quote
    |                #  or
    \\.              #   Backslash and anything
  )*                 # End of group
  " \z               # Closing quote and end of string
  /xms
于 2009-01-26T22:44:01.537 に答える
5

Text::Balancedを参照してください。車輪を再発明するよりはましです。gen_delimited_pat結果のパターンを見て、それから学ぶために使用します。

于 2009-01-27T12:25:11.957 に答える
2

RegExp::Commonは、知っておくべきもう 1 つの便利なツールです。引用符で囲まれた文字列を含む、多くの一般的なケースの正規表現が含まれています。

use Regexp::Common;

my $str = '" this is a \" quoted string"';
if ($str =~ $RE{quoted}) {
  # do something
}
于 2010-01-15T05:51:27.100 に答える
2

これは非常に簡単な方法です:

/"(?:\\?.)*?"/

このような正規表現を文字列に埋め込んでバックスラッシュを 2 倍にするかどうかを覚えておいてください。

于 2014-01-11T13:25:02.497 に答える
0

このコードを試してください: (\".+")

于 2017-01-18T01:02:16.217 に答える