2013-10-16 19 views
0

我正在向項目中添加搜索功能。當輸入一個搜索詞時,我的程序通過一個html字符串進行循環,並用包圍span標籤的搜索詞替換該詞的所有出現。 replaceAll()方法替換單詞,但它不完全是我想要做的。我不知道如何維護原始單詞的情況。例如,如果我搜索'你好':'你好'變成'你好','你好'變成'你好'。爲了解析我使用jsoup的html。替換字符串中出現的所有字,但保留原始字的大小寫

Document doc = Jsoup.parse(content); 
Elements elemenets = doc.body().getAllElements(); 

     for (int i = 1; i < elemenets.size(); i++) { 
      String elementText = elemenets.get(i).text(); 

      if (elementText.toLowerCase().contains(search_term.toLowerCase())) { 

       elemenets.get(i).html(elemenets.get(i).html().replaceAll("(?i)" + search_term, "<span id = 'first' style ='background-color:#fbaf5d;'>" + search_term + "</span>")); 
      } 

     } 
String result = doc.toString(); 
+1

http://stackoverflow.com/questions/8753163/how-can-i-perform-case-insensitive-pattern-search-and-case-preserving-replacemen的可能重複 – ajb

回答

1

得到它的工作。我需要使用regEx並將replaceAll的第二個參數中的search_term替換爲$ 1。 RegEx對我來說仍然有點神祕。感謝大家的幫助!

elemenets.get(i).html(elemenets.get(i).html().replaceAll("(?i)(" + search_term + ")", "<span>$1</span>")); 
+1

如果你的搜索詞是「你好」,那麼正則表達式就是'「(?i)(hello)」'。 '(?i)'告訴匹配器它應該在後續匹配中處理大寫和小寫字母。字母「hello」恰好與這些字母相匹配,但由於「(?i)」,它們將匹配大寫和小寫。括號中的部分(不以'(?')開始的部分是_capture groups_,它們告訴匹配器,無論匹配什麼,都要保存它,所以當匹配'hello','HeLlO'或其他類型時,字符串'$ 1'表示使用第一個捕獲組的內容,希望有幫助 – ajb

+1

(由於我在最後一條評論中用完了空間)'$ 1'只能用於替換字符串,替換字符串不是正則表達式,並沒有相同的命令。 – ajb

+0

謝謝,這確實有助於清除事情:) – sirFunkenstine

-1

只是用Apache string utils做到這一點,你的病情是否會像:

if (elementText.containsIgnoreCase(search_term)) 

注意你必須輸入org.apache.commons.lang3.StringUtils.containsIgnoreCase

+0

的問題是不是「包含」操作,但它是關於「替換」操作。 –

相關問題