1. 概述

在这个教程中,我们将探讨如何在Java中按每n个字符分割字符串

首先,我们将介绍使用Java内置方法实现此功能的方法,然后展示如何使用Guava库来达到同样的效果。

2. 使用String#split方法

String类提供了一个方便的方法split。顾名思义,它根据给定的分隔符或正则表达式将字符串分割成多个部分。

让我们看一个实例:

public static List<String> usingSplitMethod(String text, int n) {
    String[] results = text.split("(?<=\\G.{" + n + "})");

    return Arrays.asList(results);
}

如图所示,我们使用了正则表达式(?<=\\G.{” + n + “}),其中n是字符数。这是一个正向后查找断言,它匹配的是最后一个匹配项(\G)后面跟着n个字符。

现在,我们创建一个测试用例来验证一切是否按预期工作:

public class SplitStringEveryNthCharUnitTest {

    public static final String TEXT = "abcdefgh123456";

    @Test
    public void givenString_whenUsingSplit_thenSplit() {
        List<String> results = SplitStringEveryNthChar.usingSplitMethod(TEXT, 3);

        assertThat(results, contains("abc", "def", "gh1", "234", "56"));
    }
}

3. 使用String#substring方法

另一种按每n个字符分割String对象的方法是使用substring方法。

基本思路是遍历字符串,根据指定的n个字符调用substring将其划分为多个部分:

public static List<String> usingSubstringMethod(String text, int n) {
    List<String> results = new ArrayList<>();
    int length = text.length();

    for (int i = 0; i < length; i += n) {
        results.add(text.substring(i, Math.min(length, i + n)));
    }

    return results;
}

如上所述,substring方法允许我们获取字符串中从当前索引ii+n的部分。

现在,让我们通过一个测试用例确认这一点:

@Test
public void givenString_whenUsingSubstring_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingSubstringMethod(TEXT, 4);

    assertThat(results, contains("abcd", "efgh", "1234", "56"));
}

4. 使用Pattern

Pattern包提供了编译正则表达式并将其与给定字符串匹配的简洁方式。

因此,使用正确的正则表达式,我们可以使用Pattern来实现我们的目标:

public static List<String> usingPattern(String text, int n) {
    return Pattern.compile(".{1," + n + "}")
        .matcher(text)
        .results()
        .map(MatchResult::group)
        .collect(Collectors.toList());
}

如图所示,我们使用“.{1,n}”作为正则表达式来创建Pattern对象。它匹配至少一个且最多n个字符。

最后,我们编写一个简单的测试:

@Test
public void givenString_whenUsingPattern_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingPattern(TEXT, 5);

    assertThat(results, contains("abcde", "fgh12", "3456"));
}

5. 使用Guava

现在我们了解了使用Java核心方法按每n个字符分割字符串的方法,接下来来看看如何使用Guava库实现相同的功能:

public static List<String> usingGuava(String text, int n) {
    Iterable<String> parts = Splitter.fixedLength(n).split(text);

    return ImmutableList.copyOf(parts);
}

Guava库提供了Splitter类,简化了从字符串中提取子串的逻辑。fixedLength()方法将给定的字符串分割成指定长度的片段

让我们用测试用例验证我们的方法:

@Test
public void givenString_whenUsingGuava_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingGuava(TEXT, 6);

    assertThat(results, contains("abcdef", "gh1234", "56"));
}

6. 总结

总之,我们解释了如何使用Java方法在每个第n个字符处分割字符串。

之后,我们展示了如何使用Guava库来完成相同的任务。

如往常一样,本文中的所有代码可以在GitHub上的这个仓库中找到。