2016-03-09 69 views
1

我實際上正在開發一個解析器,而且我卡在一個方法上。用另一個替換特定的字符串 - String#replaceAll()

我需要清理某些句子中的特定單詞,這意味着用空格或null字符來替換這些單詞。 現在,我想出了這個代碼:

private void clean(String sentence) 
{ 
    try { 
     FileInputStream fis = new FileInputStream(
       ConfigHandler.getDefault(DictionaryType.CLEANING).getDictionaryFile()); 
     BufferedReader bis = new BufferedReader(new InputStreamReader(fis)); 
     String read; 
     List<String> wordList = new ArrayList<String>(); 

     while ((read = bis.readLine()) != null) { 
      wordList.add(read); 
     } 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

    for (String s : wordList) { 
     if (StringUtils.containsIgnoreCase(sentence, s)) { // this comes from Apache Lang 
      sentence = sentence.replaceAll("(?i)" + s + "\\b", " "); 
     } 
    } 

    cleanedList.add(sentence); 

} 

但當我查看輸出,我得到了所有的單詞的出現次數的一個空格代替我sentence更換。

有沒有人可以幫我取代只有我的句子被替換的確切單詞?

提前致謝!

+0

'sentence.replaceAll( 「(我)\\ B'」 + S + 「\\ B」,「「);' - 你省略前導'\ B'字邊界。 –

回答

2

有兩個問題在你的代碼:

  • 你缺少\b之前字符串
  • 你會遇到問題,如果任何來自該文件的話有特殊字符

要解決此問題,請按以下步驟構建正則表達式:

sentence = sentence.replaceAll("(?i)\\b\\Q" + s + "\\E\\b", " "); 

sentence = sentence.replaceAll("(?i)\\b" + Pattern.quote(s) + "\\b", " "); 
+0

我試過你的2個解決方案,沒有給我正確的輸出。完整的正則表達式是'/ \ b(my_word)\ b/gi'。我認爲我的代碼中唯一缺少的是'/ g'part,但我不知道它是否是隱含的。 – TimmyMdfck

+0

@TimmyMdfck您是否正在尋找字面上括在括號內的「myword」,例如: ''(棕色)「''快速(棕色)狐狸」''?上面的解決方案假設搜索詞是逐字的,包括所有特殊字符,並將它們視爲非特殊字符。 – dasblinkenlight

+0

其實我有一個* .dat文件中的法語單詞列表和一個* .txt文件中的整個文本。我的解析器將得到所有不是問題的句子,並將它們粘貼到另一個txt文件中。之後,將在輸出文件上使用clean方法擦除dat文件中存在的所有單詞。這是我的問題。我嘗試了一個正則表達式解釋器(這裏是所有鏈接:https://regex101.com/r/cU5lC2/507),它可以作爲一種魅力。我不明白我錯在哪裏:( – TimmyMdfck

相關問題