public static List<String> usingSplitMethod(String text,int n){
String[] results =text.split("(?<=\\G.{"+ n +"})");
return Arrays.asList(results);}
1.
2.
3.
4.
5.
我们通过使用正则表达式 "(?<=\\G.{" + n + "})"来分割字符串,其中表达式中的 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"));}}
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;}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
我们通过以下测试用例代码来验证。
@Test
public void givenString_whenUsingSubstring_thenSplit(){
List<String> results = SplitStringEveryNthChar.usingSubstringMethod("abcdefgh123456",4);
assertThat(results, contains("abcd","efgh","1234","56"));}
public static List<String> usingPattern(String text,int n){
return Pattern.compile(".{1,"+ n +"}").matcher(text).results().map(MatchResult::group).collect(Collectors.toList());}
1.
2.
3.
4.
5.
6.
7.
我们使用 .{1,n}构建了一个 Pattern 对象,它能个匹配 1 到 n 个字符, 使用下面的测试用例简单测试一下
@Test
public void givenString_whenUsingPattern_thenSplit(){
List<String> results = SplitStringEveryNthChar.usingPattern("abcdefgh123456",5);
assertThat(results, contains("abcde","fgh12","3456"));}
1.
2.
3.
4.
5.
6.
使用 Guava
到现在为止,我们已经学了几种通过 JDK 相关 API 完成这个操作的方法,下面我们来看看怎么使用 Guava 来实现这个小功能。
public static List<String> usingGuava(String text,int n){
Iterable<String> parts = Splitter.fixedLength(n).split(text);
return ImmutableList.copyOf(parts);}