我想有一个正则表达式,该表达式(在Java中)会将每个重复的辅音替换成单个字母,所有重复的辅音除了一个初始的“inn”。
我用一些例子更好地解释自己:
asso > asoassso > asoassocco > asocoinnasso > innaso
我找到了一种方法来替换所有重复的字母
Pattern.compile("([^aeiou])+\1").matcher(text).replaceAll("$1")
我找到了一种方法来识别单词是否不以“inn”开头:
Pattern.compile("^(?!inn).+").matcher(text).matches()
但是我不知道如何合并它们,即对所有双子音辅音进行归类,但是如果单词以“inn”开头,则将其首字母为“nn”。

有人可以帮助我吗? (我想使用正则表达式解决此问题,以便应用replaceAll)

谢谢

最佳答案

一种选择可能是使用组1中的inn后面的否定后缀捕获以(?<!\S)开头的单词,并捕获组2中匹配的[^aeiou]并重复对该组1的反向引用多次。

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

说明
  • (?<!\S)负向后看,断言左侧的内容不是非空格字符
  • (inn)捕获组1,匹配inn
  • |
  • (捕获组2
  • [^aeiou\r\n]匹配列出的
  • 以外的任何字符
  • )\2+关闭组并重复1次以上,捕获第2组

  • Regex demo | Java demo

    在替换中,使用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
    

    09-29 20:01