在 Java 中将字符串拆分为等长子字符串

2022-08-31 07:53:19

如何在Java中将字符串拆分为大小相等的子字符串。例如。 的 4 大小相等应给出输出。"Thequickbrownfoxjumps""Thequickbrownfoxjumps"

["Theq","uick","brow","nfox","jump","s"]

类似问题:

在 Scala 中将字符串拆分为等长的子字符串


答案 1

这是正则表达式单行版本:

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


答案 2

好吧,使用简单的算术和字符串运算来做到这一点相当容易:

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

我不认为真的值得为此使用正则表达式。

编辑:我不使用正则表达式的理由:

  • 这不使用正则表达式的任何实际模式匹配。它只是计数。
  • 我怀疑上述内容会更有效率,尽管在大多数情况下这并不重要
  • 如果您需要在不同的地方使用可变大小,则可以使用重复或帮助器函数来基于参数 - ick 构建正则表达式本身。
  • 另一个答案中提供的正则表达式首先没有编译(无效转义),然后不起作用。我的代码第一次工作。这更多地证明了正则表达式与普通代码IMO的可用性。