将字符串拆分成长度为n的元素并存入数组中

4
我该如何使用String.split()将一个充满数字的字符串平均分割成若干部分?例如,下面的每个部分的大小都为5。
"123" would be split into "123"
"12345" would be split into "12345"
"123451" would be split into "12345" and "1"
"123451234512345" would be split into "12345", "12345" and "12345"
etc

以下内容需要放入数组中:

String myString = "12345678";
String[] myStringArray = myString.split(???);
//myStringArray => "12345", "678";

我不确定要使用哪个正则表达式,也不知道如何将其分成相等大小的块。


@RohitJain 他不寻找相等的大小,而是寻找相等的模式子字符串。 - Mohsen Kamrani
1
@riista 对于 1234567123 会发生什么? - Rohit Jain
@RohitJain,它将被分为 1234567123。我对其中的内容不关心,只关心大小。 - gator
@riista 好的,那我猜你已经得到了答案。 - Rohit Jain
那么,您是在寻找长度为5的子字符串吗? - Mohsen Kamrani
显示剩余5条评论
1个回答

7
您可以尝试这种方法。
String input = "123451234512345";
String[] pairs = input.split("(?<=\\G\\d{5})");
System.out.println(Arrays.toString(pairs));

输出:

[12345, 12345, 12345]

这个正则表达式使用了“正向先行断言”机制(?<=...)\\G。其中\\G表示“前一次匹配的结束位置,如果它不存在(即我们刚开始匹配)就是字符串的开头^”。因此,该正则表达式将匹配在其前面有五个数字并且在这五个数字之前匹配过的位置上的任何地方。请注意保留HTML标记,但不要添加解释。

@RohitJain正在编写它的过程中 :) - Pshemo
在使用 \\G 方面,非常准确。 - anubhava
2
值得在这里提到的是,正向或反向预查,和所有其他锚点一样,不会消耗任何文本;这对于.split()通常会消耗分隔符来说是必要的。 - fge
1
@riista 是的。对于“123”的结果是[123]。这个正则表达式决定只在前5个数字之后分割,所以如果没有它就不会分割。 - Pshemo
2
值得一提的是 \G 的真正作用,即“从上一个匹配结束的地方开始”;由于正则表达式不会消耗任何文本,如果这里没有 \G,它将从下一个字符开始,因为如果匹配为空(在这里确实为空),正则表达式引擎会向前移动一个字符。但这可能需要解释很多...无论如何,加1。 - fge
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接