此示例仅查找sam
。如何找到 sam
和samwise
?
var regex = /sam|samwise|merry|pippin/g;
var string = 'samwise gamgee';
var match = string.match(regex);
console.log(match);
注意:这是一个简单的示例,但我的真正正则表达式是通过在时间上加入500个关键字来创建的,因此搜索所有重叠并使用类似{{{em>特殊情况)来创建它时过于繁琐1}}。我能想到的另一个明显的解决方案是单独迭代所有关键字,但我认为它必须是一个快速且优雅的,单一正则表达式解决方案。
答案 0 :(得分:2)
您可以将前瞻性正则表达式与捕获组一起用于此重叠匹配:
var regex = /(?=(sam))(?=(samwise))/;
var string = 'samwise';
var match = string.match( regex ).filter(Boolean);
//=> ["sam", "samwise"]
g
(全局)标志。filter(Boolean)
用于从匹配的数组中删除第一个空结果。答案 1 :(得分:1)
为什么不在数组substr:{/ p>上只有map indexOf()
var string = 'samwise gamgee';
var substr = ['sam', 'samwise', 'merry', 'pippin'];
var matches = substr.map(function(m) {
return (string.indexOf(m) < 0 ? false : m);
}).filter(Boolean);
See fiddle console.log(matches);
数组[&#34; sam&#34;,&#34; samwise&#34; ]
可能比使用正则表达式更好的性能。但是如果你需要正则表达式功能,例如无情匹配,单词边界,返回匹配...与exec method一起使用:
var matches = substr.map(function(v) {
var re = new RegExp("\\b" + v, "i"); var m = re.exec(string);
return (m !== null ? m[0] : false);
}).filter(Boolean);
带有i
的 This one - flag(忽略大小写)会返回每个与初始\b
word boundary匹配的第一个匹配项。
答案 2 :(得分:0)
我想不出一个简单而优雅的解决方案,但我有一些使用单一正则表达式的东西:
function quotemeta(s) {
return s.replace(/\W/g, '\\$&');
}
let keywords = ['samwise', 'sam'];
let subsumed_by = {};
keywords.sort();
for (let i = keywords.length; i--; ) {
let k = keywords[i];
for (let j = i - 1; j >= 0 && k.startsWith(keywords[j]); j--) {
(subsumed_by[k] = subsumed_by[k] || []).push(keywords[j]);
}
}
keywords.sort(function (a, b) b.length - a.length);
let re = new RegExp('(?=(' + keywords.map(quotemeta).join('|') + '))[\\s\\S]', 'g');
let string = 'samwise samgee';
let result = [];
let m;
while (m = re.exec(string)) {
result.push(m[1]);
result.push.apply(result, subsumed_by[m[1]] || []);
}
console.log(result);
答案 3 :(得分:0)
怎么样:
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
您可以使用Unique values in an array删除dupplicates。
答案 4 :(得分:0)
如果您不想创建特殊情况,并且订单无关紧要,为什么不首先只匹配全名:
\b(sam|samwise|merry|pippin)\b
然后,如果其中一些不包含较短的一个,请过滤?例如:
(sam|samwise|merry|pippin)(?=\w+\b)
这不是一个优雅的正则表达式,但我认为它比迭代所有匹配更简单。