2016-04-21 4 views
2

Это не домашнее задание. Я просто пытаюсь учиться/улучшать регулярные выражения.Используйте регулярные выражения, чтобы найти любое число или повторяющиеся слова, используя java

Я пытаюсь найти 1 или более повторяющихся слов в строке. На самом деле, я пытаюсь найти 1 или более повторяющихся слов в строке и удалить повторы. Я просмотрел link1 и link2 и попытался использовать их шаблоны, но они, похоже, не работают для меня.

Вот что у меня есть

String pattern = "\\b(\\w+)\\b\\s+\\1\\b"; 
Pattern p = Pattern.compile(pattern Pattern.CASE_INSENSITIVE); 
//This is actually read from console 
String input = "Goodbye bye bye world world world"; 
Matcher m = p.matcher(input); 
while(m.fine()) 
{ 
    System.out.println("group: " + m.group() + " start: " + m.start() + " end: " + m.end()); 
    input = input.replaceAll(m.group(), m.group(1); 
} 
System.out.println(input); 

И это мой выход:
группа: прощай старт: 8 Конец: 15 группа (1): До свидания
группа: начать мир мир: 16 конец: 27 группа (1): мир
Прощай прощай мир мир

Что я ожидаю, на 2-й линии выхода «группа: мир начать мир мир: 16 конец: 32.

Итак, ко мне, похоже, что это совпадение только первое повторное слово. Мое понимание шаблона - это \ b - граница слова, \ w + - на или больше слова (я не уверен, что это слово повторяется БЕЗ пробел, то есть словосочетание или одно или несколько слов, повторяющихся С пробел, то есть слово «слово»), затем \ b \ s + - за которым следует любое пустое пространство \ 1 - сгруппированное слово и, наконец, \ b - пробел снова.

Может кто-нибудь объяснить мне, что происходит и что это должно быть?

Спасибо!

ответ

3

Вы в основном правы в своем понимании регулярного выражения, за исключением того, что регулярное выражение проверяет только два слова подряд, а не два или более слова подряд.

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

\\b(\\w+)\\b(\\s+\\1\\b)+ 
+0

AH! Благодаря! Но следить за моим пониманием - \ w + = словосочетание или словосочетание? – Victor

+0

\ w обозначает любую букву, поэтому \ w + обозначает одну или несколько букв рядом друг с другом. Итак, \ b \ w + \ b обозначает первое слово, а \ s + \ 1 \ b обозначает слова, соответствующие первому слову после пробела. так \ w + = 'слово' (первое слово) –

+0

Получил это. Таким образом, \ w является просто ярлыком для чего-то вроде [a-zA-Z] ... – Victor

Смежные вопросы