我需要用每个基本构造单元替换单词中的重复模式。例如 我有字符串“TATATATA”,我想用“TA”替换它。此外,我可能会更换超过2次重复,以避免替换正常的单词。
我正在尝试使用replaceAll方法在Java中执行此操作。
答案 0 :(得分:6)
我认为你想要这个(适用于任何长度的重复字符串):
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
答案 1 :(得分:1)
您最好使用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
答案 2 :(得分:1)
因为您要求使用正则表达式解决方案:
(\\w)(\\w)(\\1\\2){2,};
(\w)(\w)
:匹配每对连续的单词字符((.)(.)
将捕获任何类型的每个连续字符对),将它们存储在capturing groups 1和2中。{{1} }匹配任何时候这些组中的字符会立即再次重复,(\\1\\2)
匹配重复两次或更多次({2,}
匹配时重复多次但少于十次)。
{2,10}