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

这个怎么样?

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

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

于 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

文本::平衡。这比重新发明轮子要好。用于gen_delimited_pat查看结果模式并从中学习。

于 2009-01-27T12:25:11.957 回答
2

RegExp::Common是另一个需要注意的有用工具。它包含许多常见情况的正则表达式,包括带引号的字符串:

use Regexp::Common;

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

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

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

请记住,如果您将这样的正则表达式嵌入到字符串中以使反斜杠加倍。

于 2014-01-11T13:25:02.497 回答
0

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

于 2017-01-18T01:02:16.217 回答