在每个第n个字符处拆分一个字符串

Vij*_*Dev 69 java regex string split

在JavaScript中,我们可以在每个第3个字符处拆分字符串

"foobarspam".match(/.{1,3}/g)
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚如何在Java中这样做.有什么指针吗?

Bar*_*ers 120

你可以这样做:

String s = "1234567890";
System.out.println(java.util.Arrays.toString(s.split("(?<=\\G...)")));
Run Code Online (Sandbox Code Playgroud)

产生:

[123, 456, 789, 0]
Run Code Online (Sandbox Code Playgroud)

正则表达式(?<=\G...)具有一个空字符串匹配的最后一场比赛(\G),其次是三个字符(...)之前它((?<= ))

  • 最高正则表达式mojo的疯狂道具,但作为这个代码的读者,我会追捕你,把你的房子弄成鸡蛋.:) (47认同)
  • 我不愿意认为有人投票给这个答案只是因为他们不喜欢正则表达式. (14认同)
  • 只要您通过正确命名的函数(即splitIntoParts)调用此函数并且不直接在代码中嵌入该行,这一切都很好.否则,让狩猎开始:) (4认同)
  • 使这个技巧如此可怕的部分原因是它不适用于所有语言.例如,JavaScript不支持`\ G`,Python不会拆分匹配零字符的正则表达式.但是,如果Java像其他语言一样"获得所有匹配"方法,那么你就不必首先发明这个技巧,@ Bart.;) (3认同)
  • 我将其复制/粘贴到我的Android Studio项目中,得到`[123,4567890]`作为结果:( (3认同)
  • :)我可能也会选择Simon的解决方案:如果我开始将我的正则表达式技巧添加到代码库中,我的同事可能不喜欢它. (2认同)
  • @rafa `s.split("(?&lt;=\\G.{" + number + "})")` (2认同)

Kev*_*ion 81

Java不提供功能非常全面的分割实用程序,因此Guava库可以:

Iterable<String> pieces = Splitter.fixedLength(3).split(string);
Run Code Online (Sandbox Code Playgroud)

查看Javadoc for Splitter ; 它非常强大.

  • +1这是正确的答案(也称为:*知道并使用库*) (5认同)
  • 我会把这个答案放在正则表达式上...只是因为它更易于维护(例如,事实上很少有人知道RegEx而不是ppl能够读取"可读"代码.) (3认同)
  • 只有你已经拥有番石榴依赖性才有好处.否则,您需要添加另一个依赖项 - 如果不先与同事/系统架构师联系,则不应该这样做. (3认同)

Sim*_*son 48

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        for (String part : getParts("foobarspam", 3)) {
            System.out.println(part);
        }
    }
    private static List<String> getParts(String string, int partitionSize) {
        List<String> parts = new ArrayList<String>();
        int len = string.length();
        for (int i=0; i<len; i+=partitionSize)
        {
            parts.add(string.substring(i, Math.min(len, i + partitionSize)));
        }
        return parts;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1用于选择解决问题的最简单方法. (3认同)
  • @WChargin:嗯,你是对的,我不知道为什么我写了那个评论。我会删除它。谢谢。 (2认同)

Fro*_*odo 11

作为对Bart Kiers回答的补充,我想补充一点,可以不使用...正则表达式中的三个点,这三个点代表您可以编写的.{3}具有相同含义的三个字符。

然后代码将如下所示:

String bitstream = "00101010001001010100101010100101010101001010100001010101010010101";
System.out.println(java.util.Arrays.toString(bitstream.split("(?<=\\G.{3})")));
Run Code Online (Sandbox Code Playgroud)

有了这个,修改字符串长度会更容易,并且现在使用可变输入字符串长度创建函数是合理的。这可以像下面这样完成:

public static String[] splitAfterNChars(String input, int splitLen){
    return input.split(String.format("(?<=\\G.{%1$d})", splitLen));
}
Run Code Online (Sandbox Code Playgroud)

IdeOne 中的一个例子:http ://ideone.com/rNlTj5