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

Chr*_*utz 31 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
Run Code Online (Sandbox Code Playgroud)

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

/".*[^\\]"/
Run Code Online (Sandbox Code Playgroud)

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

j_r*_*ker 41

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

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

?:字符是否有防止包含的表达式被保存为一个反向引用,但可将它们取出.

  • 这个答案更正确.我测试了更多的字符串,它比@ Cal更好用于像`"\"\'\""`这样的东西. (2认同)

Cal*_*Cal 26

这个怎么样?

/"([^\\"]|\\\\|\\")*"/
Run Code Online (Sandbox Code Playgroud)

匹配零个或多个字符不是斜杠或报价或两个斜线或斜线,然后报价

  • Paul:字符串可以由正则表达式匹配,但是括号表达式(以及任何其他可以任意嵌套的表达式)都不能. (2认同)

Leo*_*ans 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
Run Code Online (Sandbox Code Playgroud)

  • 虽然你可能想省略`\ A`和/或`\ z`--但它们暗示双引号字符串之前或后面都没有任何内容. (3认同)

Hyn*_*dil 5

请参见Text :: Balanced.它比重新发明轮更好.使用gen_delimited_pat查看结果模式和学习形成的.