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)
所有其他答案的问题在于它们仅与最初的明显测试相匹配,但不足以进行进一步的审查。例如,所有答案都希望第一个引用不会被转义。但最重要的是,转义是一个比单个反斜杠更复杂的过程,因为反斜杠本身可以被转义。想象一下尝试实际匹配以反斜杠结尾的字符串。这怎么可能?
这将是您正在寻找的模式。它不假设第一个引号是有效的,并且允许转义反斜杠。
(?<!\\)(?:\\{2})*"(?:(?<!\\)(?:\\{2})*\\"|[^"])+(?<!\\)(?:\\{2})*"
Run Code Online (Sandbox Code Playgroud)