仅匹配@,而不匹配@@,不会产生负面印象

时间:2018-09-20 03:56:06

标签: javascript regex regex-lookarounds

使用JavaScript,我需要一个正则表达式来匹配任何字符串中@ {this-format}的任何实例。我原来的正则表达式如下:

@{[a-z-]*}

但是,我还需要一种“转义”那些实例的方法。我想要这样,如果您添加一个额外的@,匹配项就可以逃脱,例如@@ {this}。

我本来是在后面使用负数的。

(?<!@)@{[a-z-]*}

这将正常工作,除了...后面是ECMAScript2018功能,仅受Chrome支持。

我读到有人建议使用否定字符集。所以我的小正则表达式变成了这样:

(?:^|[^@])@{[a-z-]*}

...本来也可以,但是如果您将其中两个放在一起则无法使用:@ {foo} @ {bar}

那么,任何人都知道我该如何实现?请记住,必须满足以下条件:

  • 在字符串中的任意位置查找@ {this}
  • 能够像@@ {this}
  • 一样逃脱
  • 能够放置多个相邻的对象,例如@ {these} @ {two}
  • 不得使用环顾四周

2 个答案:

答案 0 :(得分:1)

如果在正则表达式模式中包含@@作为替代匹配选项,它将使用@@而不是在随后的带括号的实体上允许匹配。像这样:

  

@@ |(@ {[a-z-] *})

然后可以在javascript中评估内部匹配对象。 Here is a jsfiddle使用以下代码进行演示。

var targetText = '@{foo} in a @{bar} for a @@{foo} and @{foo}@{bar} things.'
var reg = /@@|(@{[a-z-]*})/g;
var result;
while((result = reg.exec(targetText)) !== null) {
        if (result[1] !== undefined) {
        alert(result[1]);
    }
}

答案 1 :(得分:0)

您可以使用(?:^|[^@])@来匹配模式的开头,并在组中捕获以下@{<sometext>}。由于您不希望出现初始(可能)[^@],因此必须手动遍历匹配项并提取包含所需子字符串的组。例如:

function test(str) {
  const re = /(?=(?:^|[^@])(@{[a-z-]*}))./g;
  let match;
  const matches = [];
  while (match = re.exec(str)) {
    matches.push(match[1]); // extract the captured group
  }
  return matches;
}
console.log(test('@@{this}'))
console.log(test('@{these}@{two}'))