使用JavaScript,我需要一个正则表达式来匹配任何字符串中@ {this-format}的任何实例。我原来的正则表达式如下:
@{[a-z-]*}
但是,我还需要一种“转义”那些实例的方法。我想要这样,如果您添加一个额外的@,匹配项就可以逃脱,例如@@ {this}。
我本来是在后面使用负数的。
(?<!@)@{[a-z-]*}
这将正常工作,除了...后面是ECMAScript2018功能,仅受Chrome支持。
我读到有人建议使用否定字符集。所以我的小正则表达式变成了这样:
(?:^|[^@])@{[a-z-]*}
...本来也可以,但是如果您将其中两个放在一起则无法使用:@ {foo} @ {bar}
那么,任何人都知道我该如何实现?请记住,必须满足以下条件:
答案 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}'))