我們寫(xiě)代碼的時(shí)候,經(jīng)常會(huì)遇到這樣一個(gè)場(chǎng)景,那就是分割字符串。比如說(shuō)把一個(gè)字符串分成N個(gè),或者說(shuō)按照N個(gè)字符分割。
我們今天就來(lái)看看怎么每隔N個(gè)字符分割字符串。首先我們就使用 JDK 中內(nèi)置的 String#split
來(lái)分割。
使用 String#split
方法
String 類(lèi)中 split 方法,是我們平常處理字符串分割最常用的方法之一,它可以根據(jù)給定的分隔符或正則表達(dá)式將一個(gè)字符串分割成多個(gè)部分。
我們來(lái)看個(gè)例子:
public static List< String > usingSplitMethod(String text, int n) {
String[] results = text.split("(?<=G.{" + n + "})");
return Arrays.asList(results);
}
我們通過(guò)使用正則表達(dá)式 "(?<=G.{" + n + "})"
來(lái)分割字符串,其中表達(dá)式中的 n 表示字符的長(zhǎng)度。
我們可以通過(guò)以下測(cè)試用例代碼驗(yàn)證這個(gè)正則是否有效。
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"));
}
}
使用 String#substring
方法
String#substring
一般情況我們都是用于截取字符串使用的,這里我們也是可以用來(lái)處理字符串的分割,只要循環(huán)就行。
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;
}
我們通過(guò)以下測(cè)試用例代碼來(lái)驗(yàn)證。
@Test
public void givenString_whenUsingSubstring_thenSplit() {
List< String > results = SplitStringEveryNthChar.usingSubstringMethod("abcdefgh123456", 4);
assertThat(results, contains("abcd", "efgh", "1234", "56"));
}
使用 Pattern
類(lèi)
Pattern 類(lèi)通常來(lái)說(shuō),我們是用于處理正則表達(dá)式,做一些match使用,正如第一種 String#split
方法所見(jiàn),正則表達(dá)式也可以用于分割字符串。這里就展示一下,使用Pattern類(lèi)來(lái)處理字符串分割。
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}
構(gòu)建了一個(gè) Pattern
對(duì)象,它能個(gè)匹配 1 到 n 個(gè)字符, 使用下面的測(cè)試用例簡(jiǎn)單測(cè)試一下
@Test
public void givenString_whenUsingPattern_thenSplit() {
List< String > results = SplitStringEveryNthChar.usingPattern("abcdefgh123456", 5);
assertThat(results, contains("abcde", "fgh12", "3456"));
}
使用 Guava
到現(xiàn)在為止,我們已經(jīng)學(xué)了幾種通過(guò) JDK 相關(guān) API 完成這個(gè)操作的方法,下面我們來(lái)看看怎么使用 Guava 來(lái)實(shí)現(xiàn)這個(gè)小功能。
public static List< String > usingGuava(String text, int n) {
Iterable< String > parts = Splitter.fixedLength(n).split(text);
return ImmutableList.copyOf(parts);
}
Guava 通過(guò) Splitter 類(lèi)可以很簡(jiǎn)單的針對(duì)我們的這個(gè)使用場(chǎng)景,進(jìn)行字符串分割。這個(gè) fixedLength()
方法為后續(xù)的分割提供了固定的分割長(zhǎng)度。
我們通過(guò)下面的測(cè)試用例來(lái)測(cè)試一下。
@Test
public void givenString_whenUsingGuava_thenSplit() {
List< String > results = SplitStringEveryNthChar.usingGuava("abcdefgh123456", 6);
assertThat(results, contains("abcdef", "gh1234", "56"));
}
總結(jié)
字符串分割在我們工作中很常用,但大部分情況我們只會(huì)使用 String#split
, 看到其他的一些情況,是不是感覺(jué)有點(diǎn)有趣,沒(méi)想到字符串分割還能這樣玩。
-
API
+關(guān)注
關(guān)注
2文章
1499瀏覽量
61961 -
字符串
+關(guān)注
關(guān)注
1文章
578瀏覽量
20506 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521 -
JDK
+關(guān)注
關(guān)注
0文章
81瀏覽量
16592 -
string
+關(guān)注
關(guān)注
0文章
40瀏覽量
4732
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論