2014-10-15 2 views
0

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

Я относительно новым для регулярных выражений, но, насколько мне известно, это должно работать:

String input = "wool"; 
return input.matches(".*(.)/1+.*"); 

Это должно возвращать верно, так как в начале и в конце выражения, что может быть prefices или «*». достаточно. И '(.)/1+' является повторяющимся образцом любого персонажа.

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

ответ

2

Почти идеальный, только / выглядит не так (около \).

Кроме того, вам не нужно .* для префиксов и суффиксов - regexp найдет соответствие в любом месте строки, поэтому достаточно (.)\1. Это не ошибка, а просто оптимизация (хотя в других случаях она может и имеет значение).

Еще одна проблема заключается в том, что обратные косые символы являются специальными символами в строках Java, поэтому, когда вы пишете регулярное выражение в Java, вам нужно удвоить обратную косую черту. Это дает вам:

return input.matches(".*(.)\\1.*"); 

EDIT: Я забыл, что вам не нужно +, потому что если что-то повторяется 3 раза, он также повторяет 2 раза, так что вы найдете его только путем поиска двухсимвольного повторение. Опять же, не ошибка, просто не нужна здесь.

И у Киты есть хорошая точка, что ваша задача не определена, поскольку она не говорит о том, ищете ли вы повторяющиеся символы рядом друг с другом или где угодно в строке. Мое решение для смежных символов; если вам нужно повторение в любом месте, используйте его.

EDIT2 после комментариев: Забыл семантику .matches. Вы, ребята, совершенно правы, отредактированы соответствующим образом.

+0

Спасибо за ответ, но почему-то удаление «. *» Приводит к неправильным ответам. Я предполагаю, что шаблон должен соответствовать точно, а не только частично. И "(.) \\ 1" соответствует только строке, повторяющей один и тот же символ дважды. Но удвоение баххейшей решает проблему. – Hysion

+1

'input.matches (" (.) \\ 1 ");' Это не будет работать в Java, так как 'String.matches()' гарантирует соответствие регулярного выражения всей строке. Поиск существования шаблона в String может выполняться только с помощью Matcher.find(). 'input.matches (". * (.) \\ 1. * ");' то, что нужно OP. – nhahtdh

+0

Я стою исправлены. – Amadan

0

Если задача «в данной строке, по меньшей мере один символ повторяется» включает в себя следующую закономерность:

  • abcbd (b повторяется)

Затем образец регулярного выражения будет:

(.).*\1 

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

(.)\1

будет делать.

Обратите внимание, что задача состоит в том, чтобы зафиксировать «по крайней мере один символ повторяется», что означает, что для задачи достаточно идентифицировать одно вхождение, поэтому \1 не должен иметь квантор +.

Код:

return input.matches("(.).*\\1"); 

или

return input.matches("(.)\\1"); 
0

Альтернативное решение будет добавлять элементы к HashSet. Затем проверьте длину строки и хешсет.

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

  • Нет связанных вопросов^_^