Заменить повторяющиеся буквы в слове за исключением - PullRequest
4 голосов
/ 15 января 2020

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

asso > aso

assso > aso

assocco > asoco

innasso > innaso

Я нашел способ заменить все повторяющиеся буквы на

Pattern.compile("([^aeiou])+\1").matcher(text).replaceAll("$1")

Я нашел способ распознать, если слово не начинается с "inn":

Pattern.compile("^(?!inn).+").matcher(text).matches()

но я не знаю, как их объединить, ie, разложить все согласные геминизмы, кроме начального nn, если слово начинается с inn.

Любой может помочь меня? (Я хотел бы решить это с помощью регулярного выражения, чтобы применить replaceAll)

Спасибо

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Я не уверен, почему вы должны делать все это с одним регулярным выражением, но если вы должны ... попробуйте использовать отрицательный lookbehind:

Pattern.compile("((?<!^i(?=nn))[^aeiou])+\\1")

Этот разбойник разбит:

  • (?=X) означает: не потребляйте ничего, просто проверьте, есть ли X здесь. Если нет, то это не совпадение.
  • (?<!X) означает «отрицательный взгляд за спиной»: он не потребляет никаких символов, но не может соответствовать, если X встречается именно в этом месте. Итак, если в этом точном месте мы находимся на первом символе в тексте, и , то это 'i', тогда это ошибка независимо от того, что делает
  • (?<!^i(?=nn)) ничего не потреблять, но он терпит неудачу для любой позиции, где выполняется следующее: непосредственно перед «курсором» стоит i, а до этого - начало строки. После «курсора» идут 2 n. Если это все имеет место, провал. В противном случае ничего не делать (продолжить обработку).
  • Остальное - это то, что вы уже написали.
1 голос
/ 15 января 2020

Одним из вариантов может быть захват слова, начинающегося с inn, с использованием отрицательного заднего вида (?<!\S) в группе 1, захват совпадения [^aeiou] в группе 2 и повторение обратной ссылки на эту группу 1 или более раз.

(?<!\S)(inn)|([^aeiou\r\n])\2+

Пояснение

  • (?<!\S) Отрицательный взгляд сзади, утверждаем, что слева не является символом без пробела
  • (inn) Группа захвата 1, соответствует inn
    • | Или
  • ( Группа захвата 2
    • [^aeiou\r\n] Соответствует любому символу, кроме перечисленные
  • )\2+ Закрыть группу и повторить 1+ раз то, что было захвачено в группе 2

Regex demo | Java демо

При замене используйте 2 группы захвата $1$2

Например

final String regex = "(?<!\\S)(inn)|([^aeiou\\r\\n])\\2+";
final String string = "asso\n"
     + "assso\n"
     + "assocco\n"
     + "innasso";
final String subst = "$1$2";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

final String result = matcher.replaceAll(subst);

System.out.println(result);

Выход

aso
aso
asoco
innaso
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...