我需要用每个基本构建单元替换单词中的重复模式。例如,我有字符串"TATATATA",我想用"TA"替换它。此外,我可能会替换多于2次重复以避免替换正常单词。
我正在尝试使用Java的replaceAll方法来完成此操作。
我需要用每个基本构建单元替换单词中的重复模式。例如,我有字符串"TATATATA",我想用"TA"替换它。此外,我可能会替换多于2次重复以避免替换正常单词。
我正在尝试使用Java的replaceAll方法来完成此操作。
String result = source.replaceAll("(.+)\\1+", "$1")
或者,为了优先考虑长度更短的匹配项:
String result = source.replaceAll("(.+?)\\1+", "$1")
它首先匹配一组字母,然后再次匹配它(在匹配模式内使用反向引用)。我尝试了一下,似乎效果不错。
示例
String source = "HEY HEY duuuuuuude what'''s up? Trololololo yeye .0.0.0";
System.out.println(source.replaceAll("(.+?)\\1+", "$1"));
// HEY dude what's up? Trolo ye .0
在这里最好使用Pattern
而不是.replaceAll()
。例如:
private static final Pattern PATTERN
= Pattern.compile("\\b([A-Z]{2,}?)\\1+\\b");
//...
final Matcher m = PATTERN.matcher(input);
ret = m.replaceAll("$1");
编辑:例子:
public static void main(final String... args)
{
System.out.println("TATATA GHRGHRGHRGHR"
.replaceAll("\\b([A-Za-z]{2,}?)\\1+\\b", "$1"));
}
这将打印:
TA GHR
既然你要求一个正则表达式的解决方案:
(\\w)(\\w)(\\1\\2){2,};
(\w)(\w)
:匹配每一对连续的单词字符((.)(.)
会捕获任何类型的连续字符对),并将它们存储在捕获组 1和2中。 (\\1\\2)
在这些组中的字符再次立即重复时匹配,而{2,}
则是当它重复两次或更多次时匹配({2,10}
是在重复一次以上但少于十次时匹配)。
String s = "hello TATATATA world";
Pattern p = Pattern.compile("(\\w)(\\w)(\\1\\2){2,}");
Matcher m = p.matcher(s);
while (m.find()) System.out.println(m.group());
//prints "TATATATA"