咦,Java拆分個字串都這麼講究
提到 Java 拆分字串,我猜你十有八九會撂下一句狠話,“這有什麼難的,直接上 String 類的 split() 方法不就拉到了!”假如你真的這麼覺得,那可要注意了,事情遠沒這麼簡單。
來來來,搬個小板凳坐下。
假如現在有這樣一串字元“今天下雨了,今天下雪了”,需要按照中文的逗號“,”進行拆分,這意味著第一串字元為逗號前面的“今天下雨了”,第二串字元為逗號後面的“今天下雪了”(這不廢話)。另外,在拆分之前,要先進行檢查,判斷一下這串字元是否包含逗號,否則應該丟擲異常。
public
class
Test
{
public
static
void
main
(
String
[
] args
)
{
String cmower
=
"今天下雨了,今天下雪了"
;
if
(cmower
.
contains
(
","
)
)
{
String
[
] parts
= cmower
.
split
(
","
)
;
System
.out
.
println
(
"第一部分:"
+ parts
[
0
]
+
" 第二部分:"
+ parts
[
1
]
)
;
}
else
{
throw
new
IllegalArgumentException
(
"當前字串沒有包含逗號"
)
;
}
}
}
這段程式碼看起來挺嚴謹的,對吧?程式輸出的結果完全符合預期:
第一部分:今天下雨了 第二部分:今天下雪了
這是建立在字串是確定的情況下,最重要的是分隔符是確定的。否則,麻煩就來了。
大約有 12 種英文特殊符號,如果直接拿這些特殊符號替換上面程式碼中的分隔符(中文逗號),這段程式在執行的時候就會出現以下提到的錯誤。
反斜槓 \(ArrayIndexOutOfBoundsException)
插入符號 ^(同上)
美元符號 $(同上)
逗點 .(同上)
豎線 |(正常,沒有出錯)
問號 ?(PatternSyntaxException)
星號 *(同上)
加號 +(同上)
左小括號或者右小括號 ()(同上)
左方括號或者右方括號 [](同上)
左大括號或者右大括號 {}(同上)
看到這,可能有小夥伴會說,“這不是鑽牛角尖嘛”,不不不,做技術就應該秉持嚴謹的態度,否則,老大會給你的績效打低分的——獎金拿得少,可不是好滋味。
那遇到特殊符號該怎麼辦呢?上正規表示式唄。
正規表示式是一組由字母和符號組成的特殊文字,它可以用來從文字中找出滿足你想要的格式的句子。
那可能又有小夥伴說,“正規表示式那麼多,我記不住啊!”別擔心,我已經替你想好對策了。
下面這個連結是 GitHub 上學習正規表示式的一個線上文件,非常詳細。遇到正規表示式的時候,掏出這份手冊就完事了。記不住那麼多正規表示式沒關係啊,活學活用唄。
除了這份文件,還有一份:
作者收集了一些在平時專案開發中經常用到的正規表示式,可以直接拿來用,妙啊。
解決了心病之後,我們來用英文逗點“.”來替換一下分隔符:
String cmower
=
"今天下雨了.今天下雪了"
;
if
(cmower
.
contains
(
"."
)
)
{
String
[
] parts
= cmower
.
split
(
"\\."
)
;
System
.out
.
println
(
"第一部分:"
+ parts
[
0
]
+
" 第二部分:"
+ parts
[
1
]
)
;
}
在使用 split() 方法的時候,就需要使用正規表示式 \\. 來替代特殊字元英文逗點“.”了。為什麼用兩個反斜槓呢?因為它本身就是一個特殊字元,需要先轉義。
也可以使用字元類 [] 來包含英文逗點“.”,它也是一個正規表示式,用來匹配-方括號中包含的任意字元。
cmower.split("[.]");
除此之外, 還可以使用 Pattern 類的 quote() 方法來包裹英文逗點“.”,該方法會返回一個使用 \Q\E 包裹的字串。
此時,String.split() 方法的使用示例如下所示:
String [] parts = cmower.split(Pattern.quote("."));
當通過除錯模式進入 String.split() 方法原始碼的話,會發現以下細節:
return Pattern.compile(regex).split(this, limit);
String 類的 split() 方法呼叫了 Pattern 類的 split() 方法。也就意味著,我們拆分字串有了新的選擇,可以不使用 String 類的 split() 方法了。
public
class
TestPatternSplit
{
/**
* 使用預編譯功能,提高效率
*/
private
static Pattern twopart
= Pattern
.
compile
(
"\\."
)
;
public
static
void
main
(
String
[
] args
)
{
String
[
] parts
= twopart
.
split
(
"今天下雨了.今天下雪了"
)
;
System
.out
.
println
(
"第一部分:"
+ parts
[
0
]
+
" 第二部分:"
+ parts
[
1
]
)
;
}
}
除此之外,還可以使用 Pattern 配合 Matcher 類進行字串拆分,這樣做的好處是可以對要拆分的字串進行一些嚴格的限制,來看一段示例程式碼:
public
class
TestPatternMatch
{
/**
* 使用預編譯功能,提高效率
*/
private
static Pattern twopart
= Pattern
.
compile
(
"(.+)\\.(.+)"
)
;
public
static
void
main
(
String
[
] args
)
{
checkString
(
"今天下雨了.今天下雪了"
)
;
checkString
(
"今天下雨了."
)
;
checkString
(
".今天下雪了"
)
;
}
private
static
void
checkString
(
String str
)
{
Matcher m
= twopart
.
matcher
(str
)
;
if
(m
.
matches
(
)
)
{
System
.out
.
println
(
"第一部分:"
+ m
.
group
(
1
)
+
" 第二部分:"
+ m
.
group
(
2
)
)
;
}
else
{
System
.out
.
println
(
"不匹配"
)
;
}
}
}
這時候,正規表示式為 (.+)\\.(.+),意味著可以把字串按照英文逗點拆分成一個字元組,英文小括號 () 的作用就在於此(可以檢視我之前提供的正規表示式手冊)。
由於模式是確定的,所以可以把 Pattern 表示式放在 main() 方法外面,通過 static 的預編譯功能提高程式的效率。
來看一下程式的輸出結果:
第一部分:今天下雨了 第二部分:今天下雪了
//java學習交流:603835449 進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
不匹配
不匹配
不過,使用 Matcher 來匹配一些簡單的字串時相對比較沉重一些,使用 String 類的 split() 仍然是首選,因為該方法還有其他一些牛逼的功能。
比如說,你想把分隔符包裹在拆分後的字串的第一部分,可以這樣做:
String cmower
=
"今天下雨了,今天下雪了"
;
if
(cmower
.
contains
(
","
)
)
{
String
[
] parts
= cmower
.
split
(
"(?<=,)"
)
;
System
.out
.
println
(
"第一部分:"
+ parts
[
0
]
+
" 第二部分:"
+ parts
[
1
]
)
;
}
程式輸出的結果如下所示:
第一部分:今天下雨了 第二部分:今天下雪了
可以看到分隔符“,”包裹在了第一部分,如果希望包裹在第二部分,可以這樣做:
String [] parts = cmower.split("(?=,)");
溫馨提醒:如果對斷言模式比較生疏的話,可以檢視我之前提供的正規表示式手冊。
另外,假如說字串中包含了多個分隔符,而我們只需要 2 個的話,還可以這樣做:
String cmower
=
"今天下雨了,今天下雪了,今天出太陽了"
;
if
(cmower
.
contains
(
","
)
)
{
String
[
] parts
= cmower
.
split
(
","
,
2
)
;
System
.out
.
println
(
"第一部分:"
+ parts
[
0
]
+
" 第二部分:"
+ parts
[
1
]
)
;
}
split() 方法可以傳遞 2 個引數,第一個為分隔符,第二個為拆分的字串個數。檢視該方法原始碼的話,你就可以看到以下內容:
第一部分:今天下雨了 第二部分:今天下雪了,今天出太陽了
好了,我親愛的讀者朋友,以上就是本文的全部內容了。是不是突然感覺拆分個字串真的挺講究的?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2849683/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫批量插入這麼講究的麼?資料庫
- JAVA的字串這篇講清楚了Java字串
- java——split的用法(字串拆分)Java字串
- java 拆分與合併字串Java字串
- 用Java拆分字串示例和技巧 -DreamixJava字串
- 拆分合並字串(轉)字串
- 轉貼_字串分隔_拆分字串
- Java 14 都快來了,為什麼還有這麼多人固守Java 8?Java
- 聽說這四個概念,很多 Java 老手都說不清Java
- 羞,Java 字串拼接竟然有這麼多姿勢Java字串
- python拆分中英文混合字串 - 按中文拆分Python字串
- php拆分數字字串方法PHP字串
- CoffeeScript攻略3.7:拆分字串字串
- SQL Server中如何拆分字串SQLServer字串
- Java、Python 都跌出前五了,誰這麼牛?JavaPython
- Oracle自定義函式---按照某個分隔符拆分字串Oracle函式字串
- SqlServer中字串拆分仿造split功能SQLServer字串
- T-SQL技巧收集——拆分字串SQL字串
- sqlserver字串拆分(split)方法彙總SQLServer字串
- 寫程式的時候,音樂是有講究的
- 在「WAIC·臨港人工智慧開發者大會」上,這些大牛都講了什麼?AI人工智慧
- 這個錯誤,每個ScrumMaster都犯過ScrumAST
- RabbitMQ不講武德,發個訊息也這麼多花招MQ
- JAVA——拆分位數Java
- mysql拆分字串做條件查詢MySql字串
- sqlserver拆分字串函式 及應用SQLServer字串函式
- 經驗分享|BI資料視覺化大屏的顏色有什麼講究?視覺化
- 講一講Java有什麼優勢?Java
- 文科妹子都會用 GitHub,你這個工科生還等什麼Github
- 一個比較複雜的多次拆分字串的儲存過程字串儲存過程
- Java培訓都學什麼Java
- 哇塞!GitHub 上這些 Java repo 太強了吧,看完哪個都變大佬!GithubJava
- 《崩壞:星穹鐵道》第一個以東方龍為主題的角色,有何講究?
- 這兩個java類的作用是什麼?Java
- oracle拆分逗號分隔字串 實現splitOracle字串
- 拆分含有多種分隔符的字串字串
- 00後現在都這麼強的嗎,公司新來的Java開發,這操作不服不行Java
- 重新理解微服務之終究繞不過這4個坎?(觀點探討)微服務