我想制作一个与街道名称匹配的不区分大小写的正则表达式(对于JavaScript),即使每个单词都已缩写。例如:
n univ av 应该匹配 N Univ ersity Av e
国王blv 应该匹配马丁路德国王 Jr。 Blv d
ne 9th 应该匹配 NE 9th St和 9th St NE
“替换”正则表达式的加分点(JK),它将匹配的文本用<b>
标记包装。
答案 0 :(得分:11)
你得到了:
"n univ av"
你想:
"\bn.*\buniv.*\bav.*"
所以你这样做:
var regex = new RegExp("n univ av".replace(/(\S+)/g, function(s) { return "\\b" + s + ".*" }).replace(/\s+/g, ''), "gi");
瞧!
但我没有完成,我想要我的奖励积分。所以我们将模式更改为:
var regex = new RegExp("n univ av".replace(/(\S+)/g, function(s) { return "\\b(" + s + ")(.*)" }).replace(/\s+/g, ''), "gi");
然后:
var matches = regex.exec("N University Ave");
现在我们得到了:
所以,我们可以写:
var result = '';
for (var i=1; i < matches.length; i++)
{
if (i % 2 == 1)
result += '<b>' + matches[i] + '</b>';
else
result += matches[i];
}
答案 1 :(得分:2)
function highlightPartial(subject, search) {
var special = /([?!.\\|{}\[\]])/g;
var spaces = /^\s+|\s+/g;
var parts = search.split(" ").map(function(s) {
return "\b" + s.replace(spaces, "").replace(special, "\\$1");
});
var re = new RegExp("(" + parts.join("|") + ")", "gi");
subject = subject.replace(re, function(match, text) {
return "<b>" + text + "</b>";
});
return subject;
}
var result = highlightPartial("N University Ave", "n univ av");
// ==> "<b>N</b> <b>Univ</b>ersity <b>Av</b>e"
附注 - 此实现不关注匹配顺序,因此:
var result = highlightPartial("N University Ave", "av univ n");
// ==> "<b>N</b> <b>Univ</b>ersity <b>Av</b>e"
如果这是一个问题,那么就需要更复杂的顺序方法,这是我通过使用replace()
回调函数避免的。
答案 2 :(得分:1)
简单:
var pattern = "n univ av".replace(/\s+/, "|");
var rx = new RegExp(pattern, "gi");
var matches = rx.Matches("N University Ave");
或者沿着这些方向发展。
答案 3 :(得分:0)
如果这些是您的搜索字词:
听起来你的算法应该是这样的
input.split(/\s+/)
/term/i
<b>
标记中包含的术语。 input.replace(/(term)/gi, "<b>\$1</b>")
注意:您可能希望采取预防措施来逃避正则表达式元字符。