在 Java 中将字符串拆分为等长子字符串
如何在Java中将字符串拆分为大小相等的子字符串。例如。 的 4 大小相等应给出输出。"Thequickbrownfoxjumps"
"Thequickbrownfoxjumps"
["Theq","uick","brow","nfox","jump","s"]
类似问题:
如何在Java中将字符串拆分为大小相等的子字符串。例如。 的 4 大小相等应给出输出。"Thequickbrownfoxjumps"
"Thequickbrownfoxjumps"
["Theq","uick","brow","nfox","jump","s"]
类似问题:
这是正则表达式单行版本:
System.out.println(Arrays.toString(
"Thequickbrownfoxjumps".split("(?<=\\G.{4})")
));
\G
是一个零宽度断言,与上一个匹配结束的位置匹配。如果没有以前的匹配项,则它与输入的开头匹配,与 相同。封闭式后缀与从最后一场比赛结束开始的四个字符的位置相匹配。\A
两者看起来都是高级正则表达式功能,并非所有风格都支持。此外,在支持它的变种中,没有一致地实现。这个技巧(例如)在Java,Perl,.NET和JGSoft中有效,但在PHP(PCRE),Ruby 1.9 +或TextMate(都是Oniguruma)中不起作用。JavaScript 的(粘性标志)不像 灵活,即使 JS 确实支持 lookbehind,也不能以这种方式使用。\G
\G
/y
\G
我应该提到,如果您有其他选择,我不一定推荐此解决方案。其他答案中的非正则表达式解决方案可能更长,但它们也是自我记录的;这个恰恰相反。;)
此外,这在Android中不起作用,Android不支持在lookbehind中使用。\G
好吧,使用简单的算术和字符串运算来做到这一点相当容易:
public static List<String> splitEqually(String text, int size) {
// Give the list the right capacity to start with. You could use an array
// instead if you wanted.
List<String> ret = new ArrayList<String>((text.length() + size - 1) / size);
for (int start = 0; start < text.length(); start += size) {
ret.add(text.substring(start, Math.min(text.length(), start + size)));
}
return ret;
}
注意:这假设 UTF-16 代码单元(实际上)与“字符”进行 1:1 映射。对于基本多语言平面之外的字符(例如表情符号)以及组合字符(取决于您想要如何计算事物),该假设会分解。char
我不认为真的值得为此使用正则表达式。
编辑:我不使用正则表达式的理由: