2016-03-09 28 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

相关问题