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

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

AAAAAAAAA ABABAB ABCAB ABAb 

它会输出:

 A AB ABCAB ABAb 

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

 public static void main(String[] args) { List 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; } 

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

 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 

用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; } 

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

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