在字符串中查找重复的模式

时间:2014-02-22 22:52:36

标签: java string character

如何在字符串中找到重复的模式?例如,如果输入文件是

AAAAAAAAA
ABABAB
ABCAB
ABAb

它会输出:

A
AB
ABCAB
ABAb

4 个答案:

答案 0 :(得分:7)

如果使用正则表达式,则只需要一行:

String repeated = str.replaceAll("(.+?)\\1+", "$1");

分解正则表达式(.+?)\1

  • (.+?)表示“至少有一个字符,但尽可能少,作为第1组捕获”
  • \1表示“与第1组相同的字符”

这是一些测试代码:

String[] strs = {"AAAAAAAAA", "ABABAB", "ABCAB", "ABAb"};
for (String str : strs) {
    String repeated = str.replaceAll("(.+?)\\1+", "$1");
    System.out.println(repeated);
}

输出:

A
AB
ABCAB
ABAb

答案 1 :(得分:1)

这会输出你要求的东西 - 可能会改进正则表达式以避免循环但我无法修复它......

public static void main(String[] args) {
    List<String> inputs = Arrays.asList("AAAAAAAAA", "ABABAB", "ABCAB", "ABAb");
    for (String s : inputs) System.out.println(findPattern(s));
}

private static String findPattern(String s) {
    String output = s;
    String temp;
    while (true) {
        temp = output.replaceAll("(.+)\\1", "$1");
        if (temp.equals(output)) break;
        output = temp;
    }
    return output;
}

答案 2 :(得分:1)

用C#编写,但翻译应该是微不足道的。

public static string FindPattern(string s)
{
    for (int length = 1; length <= s.Length / 2; length++)
    {
        string pattern = s.Substring(0, length);
        if(MatchesPattern(s, pattern))
        {
            return pattern;
        }
    }
    return s;
}

public static bool MatchesPattern(string s, string pattern)
{
    for (int i = 0; i < s.Length; i++)
    {
        if(!s[i].Equals(pattern[i%pattern.Length]))
        {
            return false;
        }
    }
    return true;
}

答案 3 :(得分:0)

如果重复片段之间可能有空格:

(.+?)(\\ ?\\1)+