我想有一个正则表达式,该表达式(在Java中)会将每个重复的辅音替换成单个字母,所有重复的辅音除了一个初始的“inn”。
我用一些例子更好地解释自己:asso > aso
assso > aso
assocco > asoco
innasso > 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