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

PNS*_*PNS 9 java regex quotes escaping

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

"This is valid"
"This is \" also \" valid"
Run Code Online (Sandbox Code Playgroud)

显然,像

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

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

什么是正确的版本?

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

顺便说一句,我知道"全能"正则表达式

"(.*?)"
Run Code Online (Sandbox Code Playgroud)

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

arc*_*ain 14

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

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

这将捕获带引号的字符串以及任何转义的引号字符,并排除任何未出现在封闭引号中的内容.

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

"This is valid" this won't be captured "This is \" also \" valid"
Run Code Online (Sandbox Code Playgroud)

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

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

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


mak*_*iuk 7

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

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

(?<!\\)(?:\\{2})*"(?:(?<!\\)(?:\\{2})*\\"|[^"])+(?<!\\)(?:\\{2})*"
Run Code Online (Sandbox Code Playgroud)

  • @AbhijitSarkar 完成 (2认同)