2014-04-30 35 views
0

我試圖將一個文本與詞彙表列表進行匹配。問題是我的模式對於一個文本顯示不同的行爲。 例如這裏是我的文字:匹配器避免以s,ing或中間單詞結尾的單詞

\nfor Sprints \nSprints \nSprinting \nAccount Accounts Accounting\nSprintsSprints 

與下列模式匹配,我儘量只找到確切的詞與詞彙相匹配,避免查找單詞,s結尾,荷蘭國際集團,......它只返回我要「帳戶」字正確的答案,但如果我嘗試衝刺,然後返回我的衝刺,短跑等這是不正確的:

Pattern findTerm = Pattern.compile("(" + item.getTerm() + ")(\\W)",Pattern.DOTALL); 

這裏是我的代碼:

private static String findGlossaryTerms(String response, List<Glossary> glossary) { 

     StringBuilder builder = new StringBuilder(); 
     for (int offset = 0; offset < response.length(); offset++) { 
      boolean match = false; 
      if (response.startsWith("<", offset)) { 
       String newString = response.substring(offset); 
       Pattern findHtmlTag = Pattern.compile("\\<.*?\\>"); 
       Matcher matcher = findHtmlTag.matcher(newString); 
       if (matcher.find()) { 
        String htmlTag = matcher.group(0); 
        builder.append(htmlTag); 
        offset += htmlTag.length() - 1; 
        match = true; 
       } 
      } 

      for (Glossary item : glossary) { 
       if (response.startsWith(item.getTerm(), offset)) { 
        String textFromOffset = response.substring(offset - 1); 
        Pattern findTerm = Pattern.compile("(" + item.getTerm() + ")(\\W)",Pattern.DOTALL); 
        Matcher matcher = findTerm.matcher(textFromOffset); 
        if (matcher.find()) { 
         builder.append("<span class=\"term\">").append(item.getTerm()).append("</span>"); 
         offset += item.getTerm().length() - 1; 
         match = true; 
         break; 
        } 
       } 
      if (!match) 
       builder.append(response.charAt(offset)); 

     } 
     return builder.toString(); 
    } 
+1

你能舉一個真實的例子嗎?我只能說,如果你想匹配確切的單詞,使用錨('^ $')或邊界('\ b')。 –

+0

這正是我得到的字符串的一部分 – user261002

回答

2

什麼 你的模式中的\\W好嗎?如果只是爲了確保字結尾,然後使用word boundaries代替:

Pattern findTerm = Pattern.compile("(\\b" + item.getTerm() + "\\b)",Pattern.DOTALL); 

那些字邊界保證,你是很匹配的完整的單詞,並沒有得到部分匹配。

+0

我只是嘗試你的建議,但它仍然像以前一樣 – user261002

+0

然後你需要調試你的代碼。在編譯之後,首先檢查模式是什麼。 – stema

+0

對長問題進行簡短回答。 :) – zx81

相關問題