正则表达式匹配部分单词(JavaScript)

时间:2010-04-16 17:55:37

标签: javascript regex

我想制作一个与街道名称匹配的不区分大小写的正则表达式(对于JavaScript),即使每个单词都已缩写。例如:

n univ av 应该匹配 N Univ ersity Av e

国王blv 应该匹配马丁路德国王 Jr。 Blv d

ne 9th 应该匹配 NE 9th St和 9th St NE

“替换”正则表达式的加分点(JK),它将匹配的文本用<b>标记包装。

4 个答案:

答案 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");

现在我们得到了:

  • 匹配[0] =&gt;整个表达(无用)
  • 匹配[even] =&gt;我们的一场比赛
  • 匹配[odd] =&gt;附加文字不在原始匹配字符串

所以,我们可以写:

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)

如果这些是您的搜索字词:

  1. n univ av
  2. king blv
  3. ne 9th
  4. 听起来你的算法应该是这样的

    1. 按空格分割搜索(结果为搜索字词数组)input.split(/\s+/)
    2. 尝试匹配输入中的每个字词。 /term/i
    3. 对于每个匹配的输入,将每个术语替换为<b>标记中包含的术语。 input.replace(/(term)/gi, "<b>\$1</b>")
    4. 注意:您可能希望采取预防措施来逃避正则表达式元字符。