RegExp匹配除两个保留字符串外的任何字符串

RegExp to match any string except two reserved strings?

本文关键字:字符串 保留字 保留 任何 两个 RegExp      更新时间:2023-09-26

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

我试图匹配后面跟着逗号和空格的任何字符串,除非它是' hair Hugger'或'Fluid Warmer'

这是我到目前为止写的

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

任何想法?

新答案

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

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]相同。

你可以使用否定的forward:

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

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

更新:正如您提到的,您想要匹配逗号之前的任何字符串,我决定使用.而不是'w来匹配任何字符。

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

但是对于这种简单的匹配,我通常会使用

下面的内容
function contains(str, text) {
   return str.indexOf(text) >= 0;
}
if(contains(myString, 'random')) {
   //myString contains "random"
}

解决方案:

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