在RegEx中没有字符的后向引用之前,我们如何前瞻?
假设:
我们正在寻找引号内的短语,它可以是多行的“检查我们在这里有回报 但这一行仍然是前一个'a'字符串的一部分。
一旦我们有另一个'单引号测试'围绕“双引号”,它就会中断;
一旦他们自己关闭,我们如何寻找双引号和单引号?
我尝试过这种模式,但它不起作用:
/(['"])[^$1]+\1/g
答案 0 :(得分:2)
如果您的字符串没有转义序列,那就像使用tempered greedy token之类的
一样简单/(['"])(?:(?!\1)[\s\S])+\1/g
请参阅regex demo。 (?:(?!\1)[\s\S])+
匹配的任何符号([\s\S]
)都不是捕获到第1组中的值('
或"
)。要同时匹配""
或''
,请将+
(1次或更多次出现)替换为*
量词(0次或更多次出现)。
如果您有转义序列,可以使用
/(['"])(?:\\[\s\S]|(?!\1)[^\\])*?\1/g
请参阅this demo。
查看模式详细信息:
(['"])
- 第1组抓取'
或"
(?:\\[^]|(?!\1)[^\\])*?
- 0+(但尽可能少)出现
\\[^]
- 任何转义序列|
- 或(?!\1)[^\\]
- \
以外的任何字符和第1组中的字符\1
- 第1组中保留的值。注意:JS中的[\s\S]
匹配任何包含换行符的字符。一个匹配所有字符的JS唯一构造是[^]
,从性能的角度来看是优选的,但不建议这样做,因为它在其他正则表达式中不受支持(即它不可移植)。