2011-11-24 88 views
4

我正在創建一個自動完成,我遇到了一個小問題,結果突出顯示。您看到我的搜索算法非常慷慨,並且忽略結果中的撇號,因此像joes這樣的查詢將匹配Joe's。搜索算法被照顧,現在成爲突出部分。我想讓匹配的圖案變粗。JS正則表達式名稱高亮

比方說,我有一個原始的未格式化的結果:Joe’s注意到rsquo的\ u2019),我想強調這樣的:Joe’s,對下列查詢joesjoe'sjoe’s(rsquo的\ u2019 )

我在查詢中包含右側單引號,因爲您不知道是否有人從Word文檔或其他東西中複製查詢。

我可以很容易地做到這一點被忽略的事實引號有兩種搜索/結果字符串但會陷入困境,當你不小心輸入像joes'甚至更​​糟jo'es搜索整點。所以我不知何故需要保留報價位置。還請注意,撇號也可以在無格式結果字符串中的任何位置,如Suq'Ata

以下是方案的列表:


  • 字符串:Liliana's
  • 查詢:lilianasliliana's
  • 結果:Liliana's

  • 字符串:Suq'Ata
  • 查詢:suqatsuq'at
  • 結果:Suq'Ata

  • 字符串:Telim'Tor's
  • 查詢:telimttelim't
  • Resul T:Telim'Tor's

應當注意的是,在查詢中的引號的位置,而當你在放錯位置查詢報價重要的是,它不應該匹配的。所以它要麼有正確的報價位置,要麼沒有報價來突出顯示原始字符串。

我其實並不介意如果提出的解決方案是分解每個字母並循環通過它(考慮過它),因爲我只會在給定的時間將這個字符串做成5個字符串。我期待着您的建議!從提問者

+0

第一個結果應該是** Liliana's **,因爲原始字符串是'Liliana's'? –

+0

謝謝你指出,我會編輯它。 – voldomazta

回答

1

更新問題規格:

  1. 如果用戶的查詢有一個報價,其位置必須與原始字符串的報價相匹配。例如。查詢「jo'es」與原始字符串「Joe's」不匹配。
  2. 我們只需要打擾匹配查詢的開始與原始字符串的開始。

我能想到的更好的算法,但在這裏開始的,在它的快速和骯髒的首次嘗試,用天真的循環每個字母的方法:

var quotesRegex = /['\u2019]/g; 

function highlightMatch(origStr, query) {   
    query = query.toLowerCase(); 

    var j = 0; 
    for (var i = 0; i < query.length; ++i, ++j) { 
     // Query has a quote; it needs to be in the same position as origStr 
     if (query.charAt(i).match(quotesRegex)) { 
      if (!origStr.charAt(j).match(quotesRegex)) { 
       return origStr; // quote position mismatch 
      } 
      continue; 
     } 

     while (origStr.charAt(j).match(quotesRegex)) { 
      j++;     
     } 

     if (origStr.charAt(j).toLowerCase() != query.charAt(i)) { 
      return origStr; 
     } 
    } 

    return "<b>" + origStr.slice(0, j) + "</b>" + origStr.slice(j); 
} 

的jsfiddle:http://jsfiddle.net/FFt2T/6/

+0

我忘記提及查詢字符串必須僅匹配結果的開頭,就像我的查詢示例中一樣。另外,爲了強調,報價位置應該保留,以便當您在查詢中放錯報價時,報價位置應該不會匹配。所以它要麼放正確的報價位置,要麼根本不用報價。我想這不是你提出的解決方案的一個遙遠的跋涉,我會嘗試並報告會發生什麼。 – voldomazta

+0

@voldomazta因此,如果用戶輸入「Jo'es」,而不是匹配「Joes」? –

+0

正確,如果報價錯位,我們只返回原始字符串。 – voldomazta