2016-03-09 5 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 ("(я) \\ б?" + S + "\\ б"," «);' - вы опустили ведущий '\ b' границу слова. –

ответ

2

Есть две проблемы в вашем коде:

  • вам не хватает \bперед тем строка
  • Вы столкнетесь с проблемами, если любое из слов из файла имеет специальные символы

Чтобы устранить эту проблему, создайте свое регулярное выражение следующим образом:

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

или

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

Я пробовал свои 2 ssolutions, и никто не дал мне правильный выход. Полное регулярное выражение: '/ \ b (my_word) \ b/gi'. Я думаю, что единственное, что мне не хватает в моем коде, это '/ g'part, но я не знаю, подразумевается ли это или нет. – TimmyMdfck

+0

@TimmyMdfck Вы ищете словосочетание, буквально заключенное в круглые скобки, например. '" (коричневый) "' в '" Быстрая (коричневая) лиса "'? В приведенном выше решении предполагается, что поиск слов является дословным, включая все специальные символы, и рассматривает их как неспецифические. – dasblinkenlight

+0

На самом деле, я получил список французских слов в * .dat файле и целый текст в * .txt-файле. Мой парсер получит все предложения, которые не являются вопросами, и вставьте их в другой файл txt. После этого чистый метод будет использоваться в выходном файле для удаления всех слов, которые присутствуют в файле данных. И есть моя проблема. Я попытался использовать интерпретатор регулярных выражений (вот ссылка со всеми в нем: https://regex101.com/r/cU5lC2/507), и он работает как прелесть. Я не понимаю, где я ошибаюсь :( – TimmyMdfck