RegEx匹配除两个保留字符串之外的任何字符串?

时间:2011-12-20 09:58:02

标签: javascript regex

可能是一个简单的但我对创建正则表达式的了解有点模糊。

我正在尝试匹配任何字符串后跟逗号和空格,除非它是'Bair Hugger'或'Fluid Warmer'

这是我到目前为止所拥有的

var re_comma = new RegExp("\w+[^Bair Hugger|Fluid Warmer]" + ", ", "i");

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

新答案

关于你的例子我会说分割字符串并迭代它真的更容易:

function filter(str, delim, test) {
    var parts = str.split(delim),
        result = [];

    for(var i = 0, len = parts.length; i < len; i++) {
        if(test(parts[i])) result.push(parts[i]);
    }

    return result.join(delim);
}

str = filter(str, ', ', function(s) {
    s = s.toLowerCase();
    return s === 'bair hugger' || s === 'fluid warmer';
});

否则,你的表达式会变成这样:

new RegExp("(^|, )(?!(?:Bair Hugger|Fluid Warmer)(?:$|, )).+?(, |$)", "i");

并且你必须使用回调来决定是否删除前面的,或尾随,

str = str.replace(re_comma, function(str, pre, tail) {
    return pre && tail ? tail : '';// middle of the string, leave one
});

此代码的意图不太清楚。也许有一个更简单的表达式,但我认为过滤数组仍然更清晰。


旧答案:(不解决手头的问题,但提供有关正则表达式的信息)。

[]表示字符类,只会匹配您提供的一个字符。 [^Bair Hugger|Fluid Warmer][^Bair Huge|FldWm]相同。

您可以使用否定前瞻:

new RegExp("^(?!(Bair Hugger|Fluid Warmer), ).+?, $", "i");

请注意,您必须在字符串中使用\\才能生成一个\。否则,"\w"变为w并且不再是特殊字符序列。您还必须锚定表达式。

更新:正如您所说,您希望在逗号之前匹配任何字符串,我决定使用.代替\w来匹配任何字符。

答案 1 :(得分:0)

我喜欢正则表达式和Felix Kling的回答是正确的:)

然而,对于这种简单的匹配,我通常会使用类似下面的内容

function contains(str, text) {
   return str.indexOf(text) >= 0;
}

if(contains(myString, 'random')) {
   //myString contains "random"
}

答案 2 :(得分:0)

解决方案:

    reg =/(?:Bair Hugger|Fluid Warmer),| (.*)/
    str='Bair Hugger, lalala'
    reg.exec(str)
    >> ["Bair Hugger, lalala", " lalala"]
    newStr = reg.exec(str)[1]