为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2019-06-21 13:04:08
在Java中将字符串拆分为等长子串如何拆分字符串"Thequickbrownfoxjumps"在Java中大小相等的子字符串。例如。"Thequickbrownfoxjumps"四个等号的应该给出输出。["Theq","uick","brow","nfox","jump","s"]类似的问题:在Scala中将字符串拆分为等长子串
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

下面是regex一行版本:

System.out.println(Arrays.toString(
    "Thequickbrownfoxjumps".split("(?<=\\G.{4})")));

\G与上一次匹配结束的位置匹配的零宽度断言。如果有曾.没有先前的匹配,它匹配输入的开头,与\A..从上一场比赛结束到最后一场比赛的四个字符的位置匹配。

向后看和\G是高级regex特性,并不是所有口味都支持。此外,\G在支持它的所有风格中都没有一致的实现。这个技巧将起作用(例如)爪哇、Perl、.NET和JGSoft,但在PHP(PCRE)、Ruby1.9+或TextMate(都是Oniguruma)。JavaScript的/y(粘性标志)不像\G,即使JS确实支持Lookback,也不能以这种方式使用。

我应该说我不一定推荐如果你有其他选择的话,这个解决方案。其他答案中的非正则解可能更长,但它们也是自我记录的;对面那个。;)

而且,这在Android中不起作用,Android不支持使用\G向后看。


查看完整回答
反对 回复 2019-06-21
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

好吧,用蛮力做这件事是相当容易的:

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;}

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

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

  • 这并不使用regexes的任何真正模式匹配。只是数数而已。
  • 嫌疑犯

    虽然在大多数情况下,这并不重要,但上面的内容会更有效率。
  • 如果您需要在不同的地方使用可变的大小,那么您可以使用重复或一个助手函数来构建基于参数的regex本身。
  • 在另一个答案中提供的正则表达式首先没有编译(无效转义),然后不工作。我的代码第一次起作用了。这更多地证明了regexes与普通代码的可用性,IMO。


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 1162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信