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
方法允许我们获取字符串中从当前索引i到i+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上的这个仓库中找到。