如何在字符串中找到重复的模式?例如,如果输入文件是
AAAAAAAAA
ABABAB
ABCAB
ABAb
它会输出:
A
AB
ABCAB
ABAb
答案 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)+