我們寫代碼的時候,經常會遇到這樣一個場景,那就是分割字符串。比如說把一個字符串分成N個,或者說按照N個字符分割。
我們今天就來看看怎么每隔N個字符分割字符串。首先我們就使用 JDK 中內置的 String#split
來分割。
使用 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 表示字符的長度。
我們可以通過以下測試用例代碼驗證這個正則是否有效。
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
一般情況我們都是用于截取字符串使用的,這里我們也是可以用來處理字符串的分割,只要循環就行。
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;
}
我們通過以下測試用例代碼來驗證。
@Test
public void givenString_whenUsingSubstring_thenSplit() {
List< String > results = SplitStringEveryNthChar.usingSubstringMethod("abcdefgh123456", 4);
assertThat(results, contains("abcd", "efgh", "1234", "56"));
}
使用 Pattern
類
Pattern 類通常來說,我們是用于處理正則表達式,做一些match使用,正如第一種 String#split
方法所見,正則表達式也可以用于分割字符串。這里就展示一下,使用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
對象,它能個匹配 1 到 n 個字符, 使用下面的測試用例簡單測試一下
@Test
public void givenString_whenUsingPattern_thenSplit() {
List< String > results = SplitStringEveryNthChar.usingPattern("abcdefgh123456", 5);
assertThat(results, contains("abcde", "fgh12", "3456"));
}
使用 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);
}
Guava 通過 Splitter 類可以很簡單的針對我們的這個使用場景,進行字符串分割。這個 fixedLength()
方法為后續的分割提供了固定的分割長度。
我們通過下面的測試用例來測試一下。
@Test
public void givenString_whenUsingGuava_thenSplit() {
List< String > results = SplitStringEveryNthChar.usingGuava("abcdefgh123456", 6);
assertThat(results, contains("abcdef", "gh1234", "56"));
}
總結
字符串分割在我們工作中很常用,但大部分情況我們只會使用 String#split
, 看到其他的一些情況,是不是感覺有點有趣,沒想到字符串分割還能這樣玩。
-
API
+關注
關注
2文章
1500瀏覽量
62013 -
字符串
+關注
關注
1文章
579瀏覽量
20515 -
代碼
+關注
關注
30文章
4788瀏覽量
68603 -
JDK
+關注
關注
0文章
81瀏覽量
16596 -
string
+關注
關注
0文章
40瀏覽量
4735
發布評論請先 登錄
相關推薦
評論