给定以下字符串,如何使用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,否则它会达到我想要的效果。
答案 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"]
答案 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
a1
&#13;
Anubhava解决方案的BTW问题是,它没有正确检查单词ca1
边界并且可以选择像{{1}}这样的单词