日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

咦,拆分个字符串都这么讲究?

發(fā)布時間:2024/8/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 咦,拆分个字符串都这么讲究? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來源?| 沉默王二

封圖 | CSDN 付費(fèi)下載于視覺中國

提到拆分字符串,我猜你十有八九會撂下一句狠話,“這有什么難的,直接上 String 類的?split()?方法不就拉到了!”假如你真的這么覺得,那可要注意了,事情遠(yuǎn)沒這么簡單。

來來來,搬個小板凳坐下。

假如現(xiàn)在有這樣一串字符“沉默王二,一枚有趣的程序員”,需要按照中文的逗號“,”進(jìn)行拆分,這意味著第一串字符為逗號前面的“沉默王二”,第二串字符為逗號后面的“一枚有趣的程序員”(這不廢話)。另外,在拆分之前,要先進(jìn)行檢查,判斷一下這串字符是否包含逗號,否則應(yīng)該拋出異常。

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("當(dāng)前字符串沒有包含逗號");}} }

這段代碼看起來挺嚴(yán)謹(jǐn)?shù)?#xff0c;對吧?程序輸出的結(jié)果完全符合預(yù)期:

第一部分:沉默王二?第二部分:一枚有趣的程序員

這是建立在字符串是確定的情況下,最重要的是分隔符是確定的。否則,麻煩就來了。

大約有 12 種英文特殊符號,如果直接拿這些特殊符號替換上面代碼中的分隔符(中文逗號),這段程序在運(yùn)行的時候就會出現(xiàn)以下提到的錯誤。

  • 反斜杠?\(ArrayIndexOutOfBoundsException)

  • 插入符號?^(同上)

  • 美元符號?$(同上)

  • 逗點(diǎn)?.(同上)

  • 豎線?|(正常,沒有出錯)

  • 問號??(PatternSyntaxException)

  • 星號?*(同上)

  • 加號?+(同上)

  • 左小括號或者右小括號?()(同上)

  • 左方括號或者右方括號?[](同上)

  • 左大括號或者右大括號?{}(同上)

看到這,可能有小伙伴會說,“這不是鉆牛角尖嘛”,不不不,做技術(shù)就應(yīng)該秉持嚴(yán)謹(jǐn)?shù)膽B(tài)度,否則,老大會給你的績效打低分的——獎金拿得少,可不是好滋味。

那遇到特殊符號該怎么辦呢?上正則表達(dá)式唄。

正則表達(dá)式是一組由字母和符號組成的特殊文本,它可以用來從文本中找出滿足你想要的格式的句子。

那可能又有小伙伴說,“正則表達(dá)式那么多,我記不住啊!”別擔(dān)心,我已經(jīng)替你想好對策了。

下面這個鏈接是 GitHub 上學(xué)習(xí)正則表達(dá)式的一個在線文檔,非常詳細(xì)。遇到正則表達(dá)式的時候,掏出這份手冊就完事了。記不住那么多正則表達(dá)式?jīng)]關(guān)系啊,活學(xué)活用唄。

https://github.com/cdoco/learn-regex-zh

除了這份文檔,還有一份:

https://github.com/cdoco/common-regex

作者收集了一些在平時項(xiàng)目開發(fā)中經(jīng)常用到的正則表達(dá)式,可以直接拿來用,妙啊。

解決了心病之后,我們來用英文逗點(diǎn)“.”來替換一下分隔符:

String?cmower?=?"沉默王二.一枚有趣的程序員"; if?(cmower.contains("."))?{String?[]?parts?=?cmower.split("\\.");System.out.println("第一部分:"?+?parts[0]?+"?第二部分:"?+?parts[1]); }

在使用?split()?方法的時候,就需要使用正則表達(dá)式?\\.?來替代特殊字符英文逗點(diǎn)“.”了。為什么用兩個反斜杠呢?因?yàn)樗旧砭褪且粋€特殊字符,需要先轉(zhuǎn)義。

也可以使用字符類?[]?來包含英文逗點(diǎn)“.”,它也是一個正則表達(dá)式,用來匹配方括號中包含的任意字符。

cmower.split("[.]");

除此之外, 還可以使用 Pattern 類的?quote()?方法來包裹英文逗點(diǎn)“.”,該方法會返回一個使用?\Q\E?包裹的字符串。

此時,String.split()?方法的使用示例如下所示:

String?[]?parts?=?cmower.split(Pattern.quote("."));

當(dāng)通過調(diào)試模式進(jìn)入?String.split()?方法源碼的話,會發(fā)現(xiàn)以下細(xì)節(jié):

<div?class="output_wrapper"?id="output_wrapper_id"><p><code> return?Pattern.compile(regex).split(this,?limit);</code>?</p></div>

String 類的?split()?方法調(diào)用了 Pattern 類的?split()?方法。也就意味著,我們拆分字符串有了新的選擇,可以不使用 String 類的?split()?方法了。

public?class?TestPatternSplit?{/***?使用預(yù)編譯功能,提高效率*/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 類進(jìn)行字符串拆分,這樣做的好處是可以對要拆分的字符串進(jìn)行一些嚴(yán)格的限制,來看一段示例代碼:

public?class?TestPatternMatch?{/***?使用預(yù)編譯功能,提高效率*/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("不匹配");}} }

?

這時候,正則表達(dá)式為?(.+)\\.(.+),意味著可以把字符串按照英文逗點(diǎn)拆分成一個字符組,英文小括號?()?的作用就在于此(可以查看我之前提供的正則表達(dá)式手冊)。

由于模式是確定的,所以可以把 Pattern 表達(dá)式放在?main()?方法外面,通過 static 的預(yù)編譯功能提高程序的效率。

來看一下程序的輸出結(jié)果:

第一部分:沉默王二?第二部分:一枚有趣的程序員 不匹配 不匹配

不過,使用 Matcher 來匹配一些簡單的字符串時相對比較沉重一些,使用 String 類的?split()?仍然是首選,因?yàn)樵摲椒ㄟ€有其他一些牛逼的功能。

比如說,你想把分隔符包裹在拆分后的字符串的第一部分,可以這樣做:

String?cmower?=?"沉默王二,一枚有趣的程序員"; if?(cmower.contains(","))?{String?[]?parts?=?cmower.split("(?<=,)");System.out.println("第一部分:"?+?parts[0]?+"?第二部分:"?+?parts[1]); }

?

程序輸出的結(jié)果如下所示:

第一部分:沉默王二,?第二部分:一枚有趣的程序員

可以看到分隔符“,”包裹在了第一部分,如果希望包裹在第二部分,可以這樣做:

String?[]?parts?=?cmower.split("(?=,)");

?

可能有些小伙伴很好奇,?<=?和??=?是什么東東啊?它其實(shí)是正則表達(dá)式中的斷言模式。

溫馨提醒:如果對斷言模式比較生疏的話,可以查看我之前提供的正則表達(dá)式手冊。

另外,假如說字符串中包含了多個分隔符,而我們只需要 2 個的話,還可以這樣做:

String?cmower?=?"沉默王二,一枚有趣的程序員,寵愛他"; if?(cmower.contains(","))?{String?[]?parts?=?cmower.split(",",?2);System.out.println("第一部分:"?+?parts[0]?+"?第二部分:"?+?parts[1]); }

split()?方法可以傳遞 2 個參數(shù),第一個為分隔符,第二個為拆分的字符串個數(shù)。查看該方法源碼的話,你就可以看到以下內(nèi)容:

直接?substring()?到原字符串的末尾,也就是說,第二個分隔符處不再拆分。然后就 break 出循環(huán)了。來看一下程序輸出的結(jié)果:

第一部分:沉默王二?第二部分:一枚有趣的程序員,寵愛他

好了,親愛的讀者朋友,以上就是本文的全部內(nèi)容了。是不是突然感覺拆分個字符串真的挺講究的?

?

推薦閱讀

  • 一文帶你認(rèn)識keepalived,再帶你通關(guān)LVS+Keepalived!

  • 那個分分鐘處理 10 億節(jié)點(diǎn)圖計算的 Plato,現(xiàn)在怎么樣了?

  • “谷歌殺手”發(fā)明者,科學(xué)天才 Wolfram

  • 數(shù)據(jù)庫激蕩 40 年,深入解析 PostgreSQL、NewSQL 演進(jìn)歷程

  • 超詳細(xì)!一文告訴你 SparkStreaming 如何整合 Kafka !附代碼可實(shí)踐

  • 5分鐘!就能學(xué)會以太坊 JSON API 基礎(chǔ)知識!

    真香,朕在看了!

總結(jié)

以上是生活随笔為你收集整理的咦,拆分个字符串都这么讲究?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。