如何将String分成相同的重复部分

时间:2018-04-09 19:38:28

标签: java string

给定一个字符串,我想把它分成全部相同的子字符串。例如:

  • "abcabcabcabc" - > ["abc", "abc", "abc", "abc"]
  • "aaaaaa" - > ["a", "a", "a", "a", "a", "a"]
  • "abc" - > ["abc"]

我的问题是弄清楚找到打破角色的地方的逻辑。我的方法初步尝试是:

public static void FindPattern(String s) {  

    int no_of_characters = 256;
    int[] count = new int[no_of_characters];
    Arrays.fill(count, 0);

    for (int i= 0; i < s.length();i++){
         count[s.charAt(i)]++;
    }       
}

public static void main(String[] args) {
    String s = "abcabcabd";
    FindPattern(s);
}

但我不知道从那里去哪里。

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式查找重复时与整个字符串相同的最小子字符串:

String part = str.replaceAll("^(.+?)\\1*$", "$1");

打破正则表达式:

  • ^表示“输入开始”
  • (.*?)表示“捕获(作为第1组)导致匹配的最小输入量”
  • \1是第1组的返回引用,意思是“第1组中捕获的内容的另一个副本”
  • *后面引用的零个或多个
  • $1替换是第1组中捕获的内容

因为允许零个其他副本完成匹配,所以当没有重复组时,返回整个字符串,这是正确的行为。

一旦你有这个字符串,你实际上不需要“分割”字符串,你只需要n个副本。但是为方便起见,你可以通过分割上述结果的长度来分割sting相等的部分:

String[] parts = str.split("(?<=\\G.{" + str.replaceAll("^(.*?)\\1*$", "$1").length() + "})");

更简单的说,分割正则表达式是(?<=\G.{n}),这意味着“前一个匹配结束与当前位置之间有n个字符”。