Javascript中的回溯:如果之前有多个字符,则不匹配



请参阅https://regex101.com/r/463Qpm/1/

在这种情况下,我想匹配Bb和Dd

Aa : Bb, Cc : Dd

但不是在这种情况下,当有{和几个字符

{Aa : Bb, Cc : Dd

我尝试了这个正则表达式,但我有+错误。我找不到正确的语法:

(?<!{[A-Za-z]+)(?<=:s)[A-Za-z][a-z]*

通过对lookbacking的支持进行测试,您尝试的(?<!{[A-Za-z]+)(?<=:s)[A-Za-z][a-z]*模式在这两种情况下都匹配,因为在BbDd之前的位置上两个断言都为true。

直接左边有:s,而直接左边没有{[A-Za-z]+,因为不可能两者都有,因此断言为真。

请注意,有关Javascript中lookbacking的支持,请参阅此页面。


一个不使用环视的选项可以是使用带有交替的捕获组,首先排除您不想要的内容。然后把你想保留的东西放在一个小组里。

{[A-Za-z].*|:s([A-Za-z][a-z]*)

图案与匹配

  • {[A-Za-z].*匹配{,一个字符a-Za-z和行的其余部分
  • |
  • :s匹配:和一个空白字符
  • ([A-Za-z][a-z]*)捕获组1,匹配一个字符a-Za-z,后跟可选字符a-z

Regex演示

const regex = /{[A-Za-z].*|:s([A-Za-z][a-z]*)/g;
[
'Aa : Bb, Cc : Dd',
'{Aa : Bb, Cc : Dd'
].forEach(str => {
const result = Array.from(str.matchAll(regex), m => m[1]);
if (result[0] !== undefined) {
console.log(result);
}
})

使用单个查找的另一个选项可以是断言从字符串开始的左边没有{,然后断言:s

(?<=^[^{]*:s)[A-Za-z][a-z]*

Regex演示

const regex = /(?<=^[^{]*:s)[A-Za-z][a-z]*/g;
[
'Aa : Bb, Cc : Dd',
'{Aa : Bb, Cc : Dd'
].forEach(str => {
const result = str.match(regex);
if (result) {
console.log(result)    
}        
})

最新更新