Java中字符串分割常見(jiàn)的方法總結(jié)大全
技術(shù)背景
在Java編程中,經(jīng)常需要對(duì)字符串進(jìn)行分割操作,例如將一個(gè)包含多個(gè)信息的字符串按照特定的分隔符拆分成多個(gè)子字符串。常見(jiàn)的應(yīng)用場(chǎng)景包括解析CSV文件、處理網(wǎng)絡(luò)請(qǐng)求參數(shù)等。
實(shí)現(xiàn)步驟
1. 使用String#split()方法
String#split()方法是最常用的字符串分割方法,它接受一個(gè)正則表達(dá)式作為分隔符。
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556
2. 處理特殊字符分隔符
由于split()方法的參數(shù)是正則表達(dá)式,對(duì)于一些特殊字符(如.、|等),需要進(jìn)行轉(zhuǎn)義。
String string = "004.034556";
// 使用轉(zhuǎn)義字符
String[] parts1 = string.split("\\.");
// 使用字符類(lèi)
String[] parts2 = string.split("[.]");
// 使用Pattern.quote()方法
String[] parts3 = string.split(Pattern.quote("."));
3. 檢查字符串是否包含分隔符
在分割之前,可以使用String#contains()方法檢查字符串是否包含特定的分隔符。
String string = "004-034556";
if (string.contains("-")) {
String[] parts = string.split("-");
} else {
throw new IllegalArgumentException("String " + string + " does not contain -");
}
4. 保留分割字符
可以使用正則表達(dá)式的正向前瞻和正向后顧來(lái)保留分割字符。
// 分割字符在左邊
String string1 = "004-034556";
String[] parts1 = string1.split("(?<=-)");
String part11 = parts1[0]; // 004-
String part12 = parts1[1]; // 034556
// 分割字符在右邊
String string2 = "004-034556";
String[] parts2 = string2.split("(?=-)");
String part21 = parts2[0]; // 004
String part22 = parts2[1]; // -034556
5. 限制分割結(jié)果數(shù)量
可以通過(guò)split()方法的第二個(gè)參數(shù)限制分割結(jié)果的數(shù)量。
String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42
6. 使用正則表達(dá)式捕獲組
可以使用正則表達(dá)式的捕獲組來(lái)實(shí)現(xiàn)更復(fù)雜的分割和約束。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class SplitExample {
private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");
public static void checkString(String s) {
Matcher m = twopart.matcher(s);
if (m.matches()) {
System.out.println(s + " matches; first part is " + m.group(1) +
", second part is " + m.group(2) + ".");
} else {
System.out.println(s + " does not match.");
}
}
public static void main(String[] args) {
checkString("123-4567");
checkString("foo-bar");
checkString("123-");
checkString("-4567");
checkString("123-4567-890");
}
}
7. Java 8 Stream方式
在Java 8及以上版本中,可以使用Pattern.compile().splitAsStream()方法將分割結(jié)果轉(zhuǎn)換為流。
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
List<String> stringList = Pattern.compile("-")
.splitAsStream("004-034556")
.collect(Collectors.toList());
stringList.forEach(s -> System.out.println(s));
8. 使用StringTokenizer類(lèi)(不推薦)
StringTokenizer是一個(gè)遺留類(lèi),不建議在新代碼中使用,但它仍然可以用于字符串分割。
import java.util.StringTokenizer;
StringTokenizer strTkn = new StringTokenizer("004-034556", "-");
while (strTkn.hasMoreTokens()) {
System.out.println(strTkn.nextToken());
}
9. 使用Apache Commons Lang庫(kù)
Apache Commons Lang庫(kù)提供了StringUtils.split()方法,使用起來(lái)更加方便。
import org.apache.commons.lang.StringUtils; String str = "004-034556"; String[] split = StringUtils.split(str, "-");
10. 使用Google Guava庫(kù)
Google Guava庫(kù)的Splitter類(lèi)允許鏈?zhǔn)秸{(diào)用不同的字符串操作。
import com.google.common.base.Splitter;
import java.util.List;
String string = "004-034556";
List<String> result = Splitter.on('-')
.trimResults()
.omitEmptyStrings()
.splitToList(string);
核心代碼
以下是一個(gè)綜合示例,展示了不同的字符串分割方法:
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.lang.StringUtils;
import com.google.common.base.Splitter;
public class StringSplitExample {
public static void main(String[] args) {
String string = "004-034556";
// 使用String#split()方法
String[] parts1 = string.split("-");
System.out.println(Arrays.toString(parts1));
// 使用Java 8 Stream方式
List<String> parts2 = Pattern.compile("-")
.splitAsStream(string)
.collect(Collectors.toList());
System.out.println(parts2);
// 使用Apache Commons Lang庫(kù)
String[] parts3 = StringUtils.split(string, "-");
System.out.println(Arrays.toString(parts3));
// 使用Google Guava庫(kù)
List<String> parts4 = Splitter.on('-')
.trimResults()
.omitEmptyStrings()
.splitToList(string);
System.out.println(parts4);
}
}
最佳實(shí)踐
- 性能考慮:如果分割的字符串?dāng)?shù)量較多,或者需要頻繁進(jìn)行分割操作,建議使用
Pattern.compile()方法預(yù)編譯正則表達(dá)式,以提高性能。 - 異常處理:在使用
split()方法時(shí),要注意數(shù)組越界異常,特別是在不確定分割結(jié)果數(shù)量的情況下。 - 代碼可讀性:選擇合適的分割方法,使代碼更易讀和維護(hù)。例如,對(duì)于簡(jiǎn)單的單字符分隔符,使用
String#split()方法即可;對(duì)于復(fù)雜的分割需求,可以考慮使用正則表達(dá)式捕獲組。
常見(jiàn)問(wèn)題
1. 特殊字符分隔符問(wèn)題
split()方法的參數(shù)是正則表達(dá)式,對(duì)于一些特殊字符(如.、|等),需要進(jìn)行轉(zhuǎn)義。否則,這些字符會(huì)被解釋為正則表達(dá)式的元字符,導(dǎo)致分割結(jié)果不符合預(yù)期。
2. 空字符串問(wèn)題
在某些情況下,分割結(jié)果可能包含空字符串。可以使用trimResults()和omitEmptyStrings()方法來(lái)處理空字符串。
3. StringTokenizer類(lèi)的使用問(wèn)題
StringTokenizer是一個(gè)遺留類(lèi),不建議在新代碼中使用。它的功能相對(duì)有限,而且不支持正則表達(dá)式。
總結(jié)
到此這篇關(guān)于Java中字符串分割常見(jiàn)方法的文章就介紹到這了,更多相關(guān)Java字符串分割內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
swagger文檔增強(qiáng)工具knife4j使用圖文詳解
這篇文章主要介紹了swagger文檔增強(qiáng)工具knife4j使用詳解,想要使用knife4j非常簡(jiǎn)單,只要在Springboot項(xiàng)目中引入knife4j的依賴即可,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Java遞歸運(yùn)行的機(jī)制:遞歸的微觀解讀圖文分析
這篇文章主要介紹了Java遞歸運(yùn)行的機(jī)制:遞歸的微觀解讀,結(jié)合圖文形式詳細(xì)分析了java遞歸運(yùn)行的原理、機(jī)制與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-03-03
詳談Java泛型中T和問(wèn)號(hào)(通配符)的區(qū)別
下面小編就為大家?guī)?lái)一篇詳談Java泛型中T和問(wèn)號(hào)(通配符)的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
java分析html算法(java網(wǎng)頁(yè)蜘蛛算法示例)
近來(lái)有些朋友在做蜘蛛算法,或者在網(wǎng)頁(yè)上面做深度的數(shù)據(jù)挖掘,下面使用示例2014-03-03
MybatisPlus的MetaObjectHandler與@TableLogic使用
這篇文章主要介紹了MybatisPlus的MetaObjectHandler與@TableLogic使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Java實(shí)現(xiàn)ArrayList自動(dòng)擴(kuò)容
ArrayList的擴(kuò)容規(guī)則是非常簡(jiǎn)單的,它會(huì)根據(jù)需要自動(dòng)擴(kuò)容,本文就來(lái)介紹一下Java實(shí)現(xiàn)ArrayList自動(dòng)擴(kuò)容,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
java數(shù)據(jù)結(jié)構(gòu)與算法之馬踏棋盤(pán)
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之馬踏棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

