代码之家  ›  专栏  ›  技术社区  ›  nw.

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

  •  6
  • nw.  · 技术社区  · 15 年前

    我想设计一个不区分大小写的regex(用于JavaScript),它匹配街道名称,即使每个单词都被缩写。例如:

    n大学av 应该匹配 N大学 E

    应该和马丁路德匹配 国王 年少者。 D

    东北9号 应该两者都匹配 东北9号 St和

    <b> 标签。

    4 回复  |  直到 13 年前
        1
  •  13
  •   anthony_kentico Fábio Batista    6 年前

    你有:

    "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]=>整个表达式(无用)
    • 匹配[奇数]=>我们的对手之一
    • 匹配[偶数]=>不在原始匹配字符串上的其他文本

    所以,我们可以写:

    var result = '';
    for (var i=1; i < matches.length; i++)
    {
      if (i % 2 == 1)
        result += '<b>' + matches[i] + '</b>';
      else
        result += matches[i];
    }
    
        2
  •  2
  •   Tomalak    15 年前
    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() 回调函数。

        3
  •  1
  •   Paulo Santos    15 年前

    简单:

    var pattern = "n univ av".replace(/\s+/, "|");
    var rx      = new RegExp(pattern, "gi");
    var matches = rx.Matches("N University Ave");
    

        4
  •  0
  •   maček    15 年前

    如果这些是您的搜索词:

    1. n大学av
    2. 国王blv
    3. 东北9号

    听起来你的算法应该是这样的

    1. 按空间分割搜索(搜索词数组中的结果) input.split(/\s+/)
    2. 尝试匹配输入中的每个术语。 /term/i
    3. 对于每个匹配的输入,用包装在 <b> 标签。 input.replace(/(term)/gi, "<b>\$1</b>")

    注: 您可能需要采取预防措施来避开regex元字符。