首先:永远不要从未转义的变量中构建正则表达式。使用此函数先转义所有特殊字符:
RegExp.quote = function(str) {
return str.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
};
它修改了RegExp 对象,你只需要包含它一次。现在:
function stringContains(str, token) {
var
spaces = /^\s+|\s+$/g, // matches leading/trailing space
token = token.replace(spaces, ""), // trim the token
re = new RegExp("(?:^|,)\\s*" + RegExp.quote(token) + "\\s*(?:,|$)", "i");
return re.test(str);
}
alert( stringContains("dog, cat, boy", " Dog ") );
注意
-
"i" 使 new RegExp 不区分大小写。
- 这两个添加了
\s*,允许在逗号之前/之后使用空格。
-
"(?:^|,)\\s*" 是正确的,而不是 "(?:^|,)\s*""(在 JS 字符串中,所有反斜杠都需要转义)。