用于匹配转义字符(引号)的正则表达式

2022-09-03 09:25:25

我想构建一个简单的正则表达式,它涵盖了带引号的字符串,包括其中的任何转义引号。例如

"This is valid"
"This is \" also \" valid"

显然,像这样的东西

"([^"]*)"

不起作用,因为它与第一个转义引号匹配。

什么是正确的版本?

我想对于其他转义字符,答案是相同的(只需替换相应的字符)。

顺便说一句,我知道“包罗万象”正则表达式

"(.*?)"

但我尽量避免使用它,因为毫不奇怪,它的运行速度比更具体的要慢一些。


答案 1

这是我过去使用过的一个:

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

这将捕获带引号的字符串以及任何转义的引号字符,并排除括起来引号中未显示的任何内容。

例如,该模式将从以下字符串中捕获和:"This is valid""This is \" also \" valid"

"This is valid" this won't be captured "This is \" also \" valid"

此模式将不匹配字符串 ,并且将允许在字符串中使用其他转义码(例如,它将匹配 )。"I don't \"have\" a closing quote"hello world!\n"

当然,您必须转义该模式才能在代码中使用它,如下所示:

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

答案 2

所有其他答案的问题在于,它们只与最初的明显测试相匹配,但不足以进一步审查。例如,所有答案都希望第一个引号不会被转义。但最重要的是,转义是一个比单个反斜杠更复杂的过程,因为反斜杠本身可以转义。想象一下,尝试实际匹配一个以反斜杠结尾的字符串。这怎么可能呢?

这将是您正在寻找的模式。它不假定第一个引号是工作引号,并且它将允许转义反斜杠。

(?<!\\)(?:\\{2})*"(?:(?<!\\)(?:\\{2})*\\"|[^"])+(?<!\\)(?:\\{2})*"