如何将双引号字符串与转义的双引号字符匹配?

时间:2009-01-26 20:49:59

标签: regex perl escaping

我需要一个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

我需要一个能够识别所有这四种可能性的正则表达式,以及这些可能性的所有其他简单变体,作为有效字符串。我现在拥有的是:

/".*[^\\]"/

但那不对 - 除了第一个之外,它不会匹配任何一个。任何人都可以给我一个关于如何处理这个问题的正确方向吗?

7 个答案:

答案 0 :(得分:41)

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

这几乎与Cal的答案相同,但具有匹配包含转义码的字符串的优势,例如\n

?:字符用于防止包含的表达式保存为反向引用,但可以删除它们。

答案 1 :(得分:26)

这个怎么样?

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

匹配零个或多个不是斜杠或引号的字符或两个斜杠或一个斜杠然后引用

答案 2 :(得分: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

答案 3 :(得分:5)

Text::Balanced。它比重新发明轮更好。使用gen_delimited_pat查看结果模式并从中学习。

答案 4 :(得分:1)

RegExp::Common是另一个有用的工具。它包含许多常见情况的regexp,包括引用的字符串:

use Regexp::Common;

my $str = '" this is a \" quoted string"';
if ($str =~ $RE{quoted}) {
  # do something
}

答案 5 :(得分:1)

这是一个非常简单的方法:

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

请记住,如果你在字符串中嵌入这样的正则表达式来加倍反斜杠。

答案 6 :(得分:0)

试试这段代码:(\".+")