Regex 如何将字符串与可以转义的正则表达式匹配?
可能重复:Regex 如何将字符串与可以转义的正则表达式匹配?,regex,Regex,可能重复: 我正在构建一个解析器,我需要一个匹配字符串的方法:字符串以“开头和结尾。在第二个”之前,所有未转义的内容都应该匹配。转义表示在它前面有奇数个反斜杠(例如,\”或\\”) 在一些示例中,=>之前的部分是输入,另一部分是方法应提取的内容: "Hello World" => "Hello World" "Hello" World => "Hello" "Hello \"World" => "Hello \" World" "Hello \\" World => "
我正在构建一个解析器,我需要一个匹配字符串的方法:字符串以
“
开头和结尾。在第二个”
之前,所有未转义的内容都应该匹配。转义表示在它前面有奇数个反斜杠(例如,\”
或\\”
)
在一些示例中,=>
之前的部分是输入,另一部分是方法应提取的内容:
"Hello World" => "Hello World"
"Hello" World => "Hello"
"Hello \"World" => "Hello \" World"
"Hello \\" World => "Hello \\"
我猜在大多数编程语言中,反斜杠需要转义才能在字符串中有一个实际的反斜杠。这意味着需要两个反斜杠才能在字符串中得到一个真正的反斜杠。上面的例子忽略了这一点
我提出了这个正则表达式(我使用的是Ruby):
但是,它不能正确地处理第三个示例字符串,或者任何字符串都有一个反斜杠来转义“
。我注意到,当我删除最后第三行中的*
时,转义”
起作用,但它不能正确地处理示例4
我花了很长时间试图修复这个正则表达式,但我不知道如何修复。我知道这个问题可能有点难以回答,所以如果你需要更多信息,请告诉我 试试这个:
"(\\[\\"]|[^\\"])*"
红宝石演示:
快速细分:
" # a quote
( # start group 1
\\[\\"] # an escaped quote or backslash
| # OR
[^\\"] # any char except a quote or backslash
)* # end group 1 and repeat it zero or more times
" # a quote
试试这个:
"(\\[\\"]|[^\\"])*"
红宝石演示:
快速细分:
" # a quote
( # start group 1
\\[\\"] # an escaped quote or backslash
| # OR
[^\\"] # any char except a quote or backslash
)* # end group 1 and repeat it zero or more times
" # a quote
你的第四个例子是错误的。它返回“Hello\\”@false.it.Til.U.Make.it。你说它错了是什么意思?“Hello\\”应该返回。@Bergi我花了一些时间寻找一个类似的问题,但我没有找到那个问题。@dotweb:有用吗?我不确定,在正则表达式中有很多处理转义引号的方法,但我没有找到高投票率的“一网打尽”主解决方案……请注意,基于正则表达式构建一个单通道解析器将导致比预期更多的工作。大多数解析器使用两个过程,一个用于识别词汇上有用的组件(如数字、字母和双引号之类的符号),另一个用于识别双引号后跟一定数量字符的双引号应被视为“字符串”(与字符转义无关)你的第四个例子是错误的。它返回“Hello\\”@false.it.Til.U.Make.it。你说它错了是什么意思?“Hello\\”应该返回。@Bergi我花了一些时间寻找一个类似的问题,但我没有找到那个问题。@dotweb:有用吗?我不确定,在正则表达式中有很多处理转义引号的方法,但我没有找到高投票率的“一网打尽”主解决方案……请注意,基于正则表达式构建一个单通道解析器将导致比预期更多的工作。大多数解析器使用两个过程,一个用于识别词汇上有用的组件(如数字、字母和双引号之类的符号),另一个用于识别双引号后跟一定数量字符的双引号应被视为“字符串”(不考虑字符转义)。
“Hello\\”World
说不匹配。@dotweb,这是正确的:它不匹配。结尾处有一个转义反斜杠和一个转义引号,没有结束引号。这似乎非常有效。:)疯了,我今天花了很多时间想弄明白,这是一个如此简单的正则表达式“Hello\\\”World
表示不匹配。@dotweb,这是正确的:它不匹配。结尾处有一个转义反斜杠和一个转义引号,没有结束引号。这似乎非常有效。:)疯了,我今天花了很多时间想弄明白,这是一个如此简单的正则表达式!