我需要一个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
我需要一个能够识别所有这四种可能性的正则表达式,以及这些可能性的所有其他简单变体,作为有效字符串.我现在拥有的是:
/".*[^\\]"/
但那是不对的 - 除了第一个之外,它不会匹配任何一个.任何人都可以给我一个关于如何处理这个问题的正确方向吗?
/"(?:[^\\"]|\\.)*"/
这与Cal的答案几乎相同,但具有匹配包含转义码的字符串的优点,例如\n
.
的?:
字符是否有防止包含的表达式被保存为一个反向引用,但可将它们取出.
这个怎么样?
/"([^\\"]|\\\\|\\")*"/
匹配零个或多个字符不是斜杠或报价或两个斜线或斜线,然后报价
通用解决方案(匹配所有反斜杠的字符):
/ \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
请参见Text :: Balanced.它比重新发明轮更好.使用gen_delimited_pat
查看结果模式和学习形成的.