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,这是正确的:它不匹配。结尾处有一个转义反斜杠和一个转义引号,没有结束引号。这似乎非常有效。:)疯了,我今天花了很多时间想弄明白,这是一个如此简单的正则表达式!