我正在测试一系列正则表达式的字符串。其中大多数都很简单 - 通常只测试字符串中是否出现单个单词
var str = 'Blah blah foo blah';
var my_array = [
{
test: 'foo',
name: 'foo_ame'
},
{
test: 'bar',
name: 'bar_name'
}
]
for (var i = 0; i < my_array.length; i++) {
if (new RegExp(my_array[i].test).test(str)) {
console.log(my_array[i].name); // foo_name
}
}
如果字符串包含'qux'而不是'foo',我有一个我想匹配的情况,例如
for 'blah foo blah' returns foo_name
for 'blah foo qux blah' returns qux_name (only)
这个案例中只有大约30个才真正必要,所以如果我能避免它,我宁愿不重写循环。这是我可以用正则表达式匹配的东西吗?
答案 0 :(得分:1)
AFAIK,在一个正则表达式中执行此操作的唯一方法是使用环视,但它会非常笨重,因为您要捕获“foo”在之前或之前的实例“qux”。 E.g。
/^(?:(?!foo).)*qux(?:(?!foo).)*$/
我建议改变你测试字符串的方式,这样你就可以得到一个正的正则表达式和一个负的正则表达式 - 即一个字符串必须传递,一个字符串必须失败。
答案 1 :(得分:0)
我猜你正在寻找一个“负面的背后” (see this very good online help - 不幸的是,他们说javascript不支持“lookbehinds”)
例如。
(?<!a)b
匹配“b”,前面没有“a”
所以在你的情况下:
(?<!foo )qux //don't forget the space after foo