我想创建一个应该能够搜索数组的正则表达式模式。
让我们说:
var arr = [ "first", "second", "third" ];
var match = text.match(/<arr>/);
应该只能匹配
<first> or <second> or <third> ......
但应忽略
<ffirst> or <dummy>
我需要一种有效的方法。
任何帮助都会很棒。 感谢
答案 0 :(得分:4)
|
array.join加入数组元素并创建RegExp
的实例。function quoteSpecial(str) { return str.replace(/([\[\]^$|()\\+*?{}=!.])/g, '\\$1'); }
var arr = [ "first", "second", "third", "fo|ur" ];
var re = new RegExp('<(?:' + arr.map(quoteSpecial).join('|') + ')>');
//=> /<(?:first|second|third|fo\|ur)>/
然后使用此RegExp
对象:
'<first>'.match(re); // ["<first>"]
'<ffirst>'.match(re); // null
'<dummy>'.match(re); // null
'<second>'.match(re); // ["<second>"]
'<fo|ur>'.match(re); // ["<fo|ur>"]
答案 1 :(得分:3)
您应使用(a|b|c)
从列表中搜索特定字词。
列表来自arr
,将|
char作为粘合剂加入值
var arr = [ "first", "second", "third" ];
var match = text.match(new RegExp("<(?:"+arr.join("|")+")>")); //matches <first> <second> and <third>
请注意,如果你的&#34;来源&#34;单词可能包含正则表达式的保留字符 - 您可能会遇到麻烦 - 因此您可能需要在加入数组之前转义这些字符
可以找到这样做的好功能here:
function regexpQuote(str, delimiter) {
return String(str)
.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
}
所以在这种情况下你会有
function escapeArray(arr){
var escaped = [];
for(var i in arr){
escaped.push(regexpQuote(arr[i]));
}
return escaped;
}
var arr = [ "first", "second", "third" ];
var pattern = new RegExp("<(?:"+escapeArray(arr).join("|")+")>");
var match = text.match(pattern); //matches <first> <second> and <third>