Javascript RegExp - 我如何匹配一个单词,但如果另一个单词也存在则不会?

时间:2011-08-19 12:18:17

标签: javascript regex

我正在测试一系列正则表达式的字符串。其中大多数都很简单 - 通常只测试字符串中是否出现单个单词

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个才真正必要,所以如果我能避免它,我宁愿不重写循环。这是我可以用正则表达式匹配的东西吗?

2 个答案:

答案 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