Логический код Java - удалить текст из строки

Я хочу удалить любое появление предложения «счастлив» из очень большого текста, игнорируя чувствительность к регистру. Вот некоторые из этих больших текстовых предложений:

  1. «Она счастлива. Мне это нравится».

  2. «Его счастливый сын»

  3. «Он счастлив весь день»

  4. «Таша счастлива»

  5. «Выберите один из следующих вариантов: грустит-радуется-плачет»

Мой исходный код:

String largeText = "....";  // The very large text here.
String removeText = "is happy";
largeText = largeText.replaceAll( "(?i)" + removeText , "" ); 

Этот код будет нормально работать с предложениями номер 1, 3, 4, 5. Но я не хочу удалять его из предложения номер 2, так как он имеет другое значение. Как я могу это сделать?


person Brad    schedule 23.12.2010    source источник
comment
вам нужно будет более конкретно указать, когда вы не хотите заменять, только в этом конкретном предложении или во всех предложениях определенной формы? Можете ли вы написать некоторые правила о том, когда вы должны и не должны совпадать? если да, можете ли вы написать эти правила в коде?   -  person GreyCloud    schedule 23.12.2010


Ответы (2)


Используйте \b вокруг шаблона, чтобы определить границы слов. то есть:

String largeText = "....";  // The very large text here.
String removeText = "is happy";
largeText = largeText.replaceAll( "(?i)\\b" + removeText + "\\b" , "" ); 
person Laurence Gonsalves    schedule 23.12.2010
comment
.. Это прекрасно работает. Просто вопрос ... Будет ли это также работать для букв Unicode (другие языки)? - person Brad; 24.12.2010
comment
@Brad: Из документации для java.util.regex.Pattern видно, что [a-zA-Z_0-9] используется для словесных символов, поэтому я предполагаю, что это также определение, которое они используют для границ слов. Вы можете попробовать использовать отрицательные утверждения вместо \b для поиска определенных классов символов Unicdoe, но обратите внимание, что это не будет работать для китайского или любого другого языка, который не требует пробелов между словами, если вы сначала не сегментируете ввод. - person Laurence Gonsalves; 24.12.2010

Возможно, вы захотите изучить атомарные утверждения нулевой ширины — шаблоны, которые соответствуют позициям внутри строки (например, границе слова), а не самому тексту.

Этот вопрос задавался ранее; см. эту ссылку для получения дополнительной информации:

вопрос регулярного выражения java String.replaceAll

person user541686    schedule 23.12.2010