正则表达式替换重复的字符串模式

时间:2014-06-03 06:43:58

标签: java regex string pattern-matching replaceall

我需要用每个基本构造单元替换单词中的重复模式。例如 我有字符串“TATATATA”,我想用“TA”替换它。此外,我可能会更换超过2次重复,以避免替换正常的单词。

我正在尝试使用replaceAll方法在Java中执行此操作。

3 个答案:

答案 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}