使用正则表达式匹配独立的a1值

时间:2015-03-04 11:11:16

标签: javascript regex

给定以下字符串,如何使用regEx匹配所有独立的a1值(替换):

a1 +a1 +a1:a10 + b1 + c1:d10 + a1:a1 +a1+ a1 + a1

即。 a1:a10,b1,c1:d10,a1:a1不应匹配。应该假设一个场景,其中字符串是动态的并且可以改变,具有不同的范围。

所需的匹配输出:a1,a1,a1,a1,a1。 "独立"暗示它没有" :"例如a1:a1不是独立的。匹配+ a1或[空格] a1是不可接受的。

在我的努力中,最大的问题是消除a1:a1和a1:a10因为javascript不支持负面看。

请注意:有些a1的前/后是空格,有些不是例如+ a1 +这应该仍然匹配。我们还应该假设其他运算符,例如* a1 +

您可以在此处查看我未完成的尝试:http://regexr.com/3ahpl。 < - 我的例子错误地匹配a1中的a1:a10和a1:a1,否则它会达到我想要的效果。

3 个答案:

答案 0 :(得分:0)

假设您要用a1替换所有这些foo,您可以使用:

var input = 'a1 +a1 +a1:a10 + b1 + c1:d10 + a1:a1 +a1+ a1 + a1 pa1';    
var re = /(^|[^:]\b)a1\b(?!:)/g;    
var arr=[];

while (m = re.exec(input)) { arr.push(m[1]); }

console.log ( arr );
["a1", "a1", "a1", "a1", "a1"]

RegEx Demo

答案 1 :(得分:0)

var a1s = input.replace(/\S+a1\S+/g, function(m) { 
   return m.replace(/\W/g,"") == "a1" ? "foo" : m; 
});

这里我们捕获删除任何加号,然后检查它是否为a1

答案 2 :(得分:0)

实际上,仅a1取消(?:^|[^:])\b(a1)\b(?!:)的正确正则表达式是a1。以下是解释:

在英语中,问题解决方案说明是:选择任何:元素作为单词,并且不在(?<!:)\b(a1)\b(?!:) (冒号)之前或之后。< / p>

在纯正则表达式语言中,解决方案是:

a1

其中\b(a1)\b被字边界(?<!:)包围,冒号(?!:)为负后方,冒号[^:]为负前瞻。

然而, JavaScript 正则表达式存在问题,因为它不支持负面的后置语法,所以我们必须以某种方式mimic it。因此,我们需要用非捕获组替换负面的后视部分,该非捕获组声明前面的字符不能是冒号a1。表达似乎没有问题,因为从输入开始的第一个^例外。为此,我们将符号(?:^|[^:])放在允许的字符组var input = "a1 +a1 + ca1+ +a1:a10 + b1 + c1:d10 + a1:a1 +a1+ a1 + a1" var regex = /(?:^|[^:])\b(a1)\b(?!:)/g var arr = [] while (m = regex.exec(input)) arr.push(m[1]); alert(arr)上。之后,所有的工作都像魅力。

以下是DEMO

&#13;
&#13;
a1
&#13;
&#13;
&#13;

Anubhava解决方案的BTW问题是,它没有正确检查单词ca1边界并且可以选择像{{1}}这样的单词