在字符串中查找重复的模式
如何在字符串中找到重复的模式? 例如,如果输入文件是
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)+