可能是一个简单的但我对创建正则表达式的知识有点模糊.
我试图匹配任何字符串后跟逗号和空格,除非它是'Bair Hugger'或'Fluid Warmer'
这是我到目前为止所拥有的
var re_comma = new RegExp("\w+[^Bair Hugger|Fluid Warmer]" + ", ", "i");
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
新答案
关于你的例子我会说分割字符串并迭代它真的更容易:
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';
});
Run Code Online (Sandbox Code Playgroud)
否则,你的表达式会变成这样:
new RegExp("(^|, )(?!(?:Bair Hugger|Fluid Warmer)(?:$|, )).+?(, |$)", "i");
Run Code Online (Sandbox Code Playgroud)
并且您必须使用回调来替换以决定是否删除前一个,或尾随,或不:
str = str.replace(re_comma, function(str, pre, tail) {
return pre && tail ? tail : '';// middle of the string, leave one
});
Run Code Online (Sandbox Code Playgroud)
这段代码的意图不太清楚.也许有一个更简单的表达式,但我认为过滤数组仍然更清晰.
旧答案:(不解决手头的问题,但提供有关正则表达式的信息).
[]表示一个字符类,只匹配您提供的字符中的一个字符.[^Bair Hugger|Fluid Warmer]是一样的[^Bair Huge|FldWm].
您可以使用否定前瞻:
new RegExp("^(?!(Bair Hugger|Fluid Warmer), ).+?, $", "i");
Run Code Online (Sandbox Code Playgroud)
请注意,您必须\\在字符串内部使用它来生成一个\.否则,"\w"变成w并且不再是特殊字符序列.您还必须锚定表达式.
更新:正如您所提到的,您希望在逗号之前匹配任何字符串,我决定使用.而不是\w匹配任何字符.