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