Как удалить 3 или более последовательных букв в Java в 2 последовательных буквы?

Я пытаюсь обработать строки с повторяющимися символами, чтобы найти правильное слово в словаре.

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

Тогда я поищу в словаре, существует ли это слово. Если слово не существует, то я должен удалить две последовательные буквы только в одну букву.

Пример:

gooooooood -> good (this existis)
awesooooome -> awesoome (this doesn't exist) -> awesome (this exists)
aaawwwesooooooommmme -> aawwesoomme (this doesn't exist) -> awesome (this exists)

Я работаю с JAVA, и я уже использую это регулярное выражение, чтобы получить слова с 3 или более повторяющимися буквами в строке:

Pattern p = Pattern.compile("\\b\\w*(\\w)\\1{2}\\w*");

2 ответа

Решение

Вы можете использовать это регулярное выражение ("чистая версия"):

(\b\w*?)(\w)\2{2,}(\w*)

Струнная версия:

"(\\b\\w*?)(\\w)\\2{2,}(\\w*)"

Вы должны использовать replaceAll(regex, "$1$2$2$3")

объяснение

(\b\w*?) // capture group 1 is lazy
(\w)     // capture group 2 captures the first occurrence of the char
\2{2,}   // char may occur 2 or more times...
(\w*)    // capture group 3

Обратите внимание, что $number под заменой подразумевается содержание соответствующей группы захвата.

Вы также можете сделать это так:

Pattern pattern = Pattern.compile("(\\w)\\1{2,}");
System.out.println(pattern.matcher("gooooooood").replaceAll("$1$1"));
System.out.println(pattern.matcher("awesooooome").replaceAll("$1$1"));
System.out.println(pattern.matcher("aaawwwesooooooommmme").replaceAll("$1$1"));

Выход:

good
awesoome
aawwesoomme

И для второго шага вот как вы можете это сделать:

Pattern pattern2 = Pattern.compile("(\\w)\\1");
System.out.println(pattern2.matcher("awesoome").replaceAll("$1"));
System.out.println(pattern2.matcher("aawwesoomme").replaceAll("$1"));

Выход:

awesome
awesome
Другие вопросы по тегам