首页 > 解决方案 > Javascript中的Lookbehind:如果之前有多个字符,则不匹配

问题描述

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]*

标签: javascriptregex

解决方案


在支持后向测试的情况下,您尝试的模式(?<!{[A-Za-z]+)(?<=:\s)[A-Za-z][a-z]*在这两种情况下都匹配,因为两个断言在Bb和之前的位置都为真Dd

:\s直接在左边,没有{[A-Za-z]+直接在左边,因为不可能同时拥有两者,因此断言是正确的。

请注意查看此页面以支持 Javascript 中的lookbehind。


一个不使用环视的选项可能是使用带有交替的捕获组,首先排除您不想要的。然后在一个组中捕获您想要保留的内容。

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

模式匹配

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

正则表达式演示

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);
  }
})

使用单个lookbehind的另一个选项可能是断言{从字符串开头的左侧没有,然后断言:\s

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

正则表达式演示

    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)    
        }        
    })


推荐阅读