Javascript 只匹配@而不匹配@不带负查找

Javascript 只匹配@而不匹配@不带负查找,javascript,regex,regex-lookarounds,Javascript,Regex,Regex Lookarounds,使用JavaScript,我需要一个正则表达式来匹配任何字符串中@{this format}的任何实例。我最初的正则表达式如下: @{[a-z-]*} 然而,我还需要一种方法来“逃避”这些实例。我希望这样,如果您添加一个额外的@,匹配项将被转义,如@{this} 我最初使用了一种消极的回顾: (?<!@)@{[a-z-]*} …如果你把这两个放在一起就不行了:{foo}{bar} 那么,有人知道我如何才能做到这一点吗?请记住,需要满足以下条件: 在字符串中的任意位置查找@{this}

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

@{[a-z-]*}
然而,我还需要一种方法来“逃避”这些实例。我希望这样,如果您添加一个额外的@,匹配项将被转义,如@{this}

我最初使用了一种消极的回顾:

(?<!@)@{[a-z-]*}
…如果你把这两个放在一起就不行了:{foo}{bar}

那么,有人知道我如何才能做到这一点吗?请记住,需要满足以下条件:

  • 在字符串中的任意位置查找@{this}
  • 能够像@@{this}那样逃跑
  • 能够放置多个相邻的,比如{this}{two}
  • 不得使用lookbehind
您可以使用
(?:^ |[^@])@
匹配模式的开头,并在组中捕获以下
@{}
。由于您不希望结果中包含初始(可能的)
[^@]
,因此必须手动迭代匹配并提取包含所需子字符串的组。例如:

功能测试(str){
常数re=/(?=(?:^ |[^@])(@{[a-z-]*}))/g;
让我们比赛;
常量匹配=[];
while(match=re.exec(str)){
matches.push(match[1]);//提取捕获的组
}
返回比赛;
}
log(test('@{this}'))

console.log(test('@{this}@{two}')
如果在正则表达式模式中包含@@作为替代匹配选项,它将使用@@而不允许在后续括号中的实体上进行匹配。像这样:

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

然后可以在javascript中计算内部匹配对象。要演示,请使用以下代码

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

只是想澄清一下。。。它不适用于输入
{foo}{bar}
,因为它只找到一个匹配项,而不是两个匹配项(一个用于
{foo}
,一个用于
{bar}
)?谢谢,这是一个非常好的解决方案,我将使用这个解决方案。但是,只有一件事,如果我输入
@@@@{text}
,它会将其视为两个单独的匹配项,
@
@{text}
。不过很容易修复,只需在第二个@之后添加一个+即可,如
/@+|(@{[a-z-]*})/g
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]);
    }
}