簡體   English   中英

正則表達式匹配部分單詞(JavaScript)

[英]Regex to match partial words (JavaScript)

我想制作一個與街道名稱匹配的不區分大小寫的正則表達式(對於JavaScript),即使每個單詞都已縮寫。 例如:

n univ av應該匹配N Univ ersity Av e

國王blv應該匹配Martin Luther King Jr. Blv d

ne 9th應該匹配NE 9th St和9th St NE

使用<b>標簽包裝匹配文本的“替換”正則表達式的加分點(JK)。

你得到了:

"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] =>整個表達式(無用)
  • 匹配[odd] =>我們的一場比賽
  • 匹配[even] =>不在原始匹配字符串上的其他文本

所以,我們可以寫:

var result = '';
for (var i=1; i < matches.length; i++)
{
  if (i % 2 == 1)
    result += '<b>' + matches[i] + '</b>';
  else
    result += matches[i];
}
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()回調函數避免的。

簡單:

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

或者沿着這些方向的東西。

如果這些是您的搜索字詞:

  1. n univ av
  2. 國王blv
  3. 9號

聽起來你的算法應該是這樣的

  1. 按空格分割搜索(結果搜索條件數組) input.split(/\\s+/)
  2. 嘗試匹配輸入中的每個術語。 /term/i
  3. 對於每個匹配的輸入,將每個術語替換為包含在<b>標記中的術語。 input.replace(/(term)/gi, "<b>\\$1</b>")

注意:您可能希望采取預防措施來逃避正則表達式元字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM