Guava學(xué)習(xí)之CharMatcher

本文是對(duì) Guava 中 CharMatcher 的學(xué)習(xí)介紹。歡迎加入學(xué)習(xí)項(xiàng)目: LearningGuava。

以下參考:

概覽

之前,Guava 中的 StringUtil 在無(wú)節(jié)制地增長(zhǎng),具有很多方法,如:

  • allAscii
  • collapse
  • collapseControlChars
  • collapseWhitespace
  • lastIndexNotOf
  • numSharedChars
  • removeChars
  • removeCrLf
  • retainAllChars
  • strip
  • stripAndCollapse
  • stripNonDigits

這些函數(shù)本質(zhì)上是以下兩個(gè)方面的乘積(M x N 種情況):

  1. 何如定義一個(gè)“匹配”的字符? (M 種情況)
  2. 對(duì)“匹配”的字符進(jìn)行怎樣的操作? (N 種情況)

為了解決這樣的爆炸式增長(zhǎng),Guava 提供了 CharMatcher。一個(gè) CharMacher 實(shí)例本身,界定了一個(gè)匹配字符的集合,而 CharMacher 實(shí)例的方法,解決了要對(duì)匹配字符做什么的問(wèn)題。然后我們就可以用最小化的 API 來(lái)處理字符匹配和字符操作,把 M×N 的復(fù)雜度下降到了 M+N。

直觀地說(shuō),你可以把 CharMatcher 看做是一些特別字符串的表示,例如:數(shù)字、空格等。而事實(shí)上,CharMatcher 只是一個(gè)針對(duì)字符串的布爾斷言(它實(shí)現(xiàn)了 Predicate<Character>),但考慮到“所有空白字符串”、“所有小寫單詞”等相關(guān)需求是很普遍的,Guava 還是為字符串提供了專門的語(yǔ)法和 API。

CharMatcher 的功能主要在于對(duì)特定類或字符串執(zhí)行這些操作:trimming、collapsing、removing、retaining 等。

使用示例

創(chuàng)建 CharMatcher

很多需求都可以被 CharMatcher 的工廠方法滿足:

其它一些常用的獲得一個(gè) CharMatcher 的方法包括:

方法 描述
anyOf(CharSequence) 表明你想匹配的所有字符,例如:CharMatcher.anyOf("aeiou") 可以匹配小寫元音字母。
is(char) 表明你想匹配的一個(gè)確定的字符。
inRange(char, char) 表明你想匹配的一個(gè)字符范圍,例如:CharMatcher.inRange('a', 'z')。

此外,CharMatcher 還有這些方法:negate()and(CharMatcher)、or(CharMatcher)。這些方法可以為 CharMatcher 提供方便的布爾運(yùn)算。

使用 CharMatcher

CharMatcher 提供了很多方法來(lái)對(duì)匹配的字符序列 CharSequence 進(jìn)行操作。以下只是列出了一些常用方法。

方法 描述
collapseFrom(CharSequence, char) 將一組連續(xù)匹配的字符串替換為一個(gè)指定的字符。例如:WHITESPACE.collapseFrom(string, ' ') 可以將連續(xù)的空字符串替換為單個(gè)字符。
matchesAllOf(CharSequence) 測(cè)試字符序列是否全部匹配。例如:ASCII.matchesAllOf(string) 可以測(cè)試字符是否全部是 ASCII。
removeFrom(CharSequence) 將匹配的字符序列移除
retainFrom(CharSequence) 將沒(méi)有匹配的字符序列移除
trimFrom(CharSequence) 去除開(kāi)頭和結(jié)尾匹配的部分
replaceFrom(CharSequence, CharSequence) 將匹配的字符替換為給定的序列

方法分類

根據(jù)函數(shù)的返回值和名稱將這些方法分為三類。

第一類是判定型函數(shù),判斷 CharMacher 和入?yún)⒆址钠ヅ潢P(guān)系。

CharMatcher.is('a').matchesAllOf("aaa");//true
CharMatcher.is('a').matchesAnyOf("aba");//true
CharMatcher.is('a').matchesNoneOf("aba");//true

第二類是計(jì)數(shù)型函數(shù),查找入?yún)⒆址械谝淮?、最后一次出現(xiàn)目標(biāo)字符的位置,或者目標(biāo)字符出現(xiàn)的次數(shù),比如 indexIn,lastIndexIncountIn。

CharMatcher.is('a').countIn("aaa"); // 3
CharMatcher.is('a').indexIn("java"); // 1

第三類就是對(duì)匹配字符的操作。包括 removeFrom、retainFrom、replaceFrom、trimFrom、collapseFrom 等。

CharMatcher.is('a').retainFrom("bazaar"); // "aaa"
CharMatcher.is('a').removeFrom("bazaar"); // "bzr"
CharMatcher.anyOf("ab").trimFrom("abacatbab"); // "cat"

源碼分析

源碼有很多行,主要的邏輯是這樣的:

  • CharMatcher 是個(gè)抽象類,內(nèi)部有一些私有的實(shí)現(xiàn)類,通過(guò)一些工廠函數(shù) is、anyOf 等工廠函數(shù)創(chuàng)建對(duì)應(yīng)的實(shí)例(固定的是單例,變化的會(huì)創(chuàng)建一個(gè)具體實(shí)例)。
  • 不同的實(shí)例主要實(shí)現(xiàn)的是 CharMatcher 中的 matches 方法,這樣就實(shí)現(xiàn)了不同策略的匹配器。
  • 基于上述匹配方法 matches,可以進(jìn)行統(tǒng)計(jì)工作(countIn等)、查找工作(indexIn等)、修改工作(trimFrom)等。

這樣的設(shè)計(jì)最基礎(chǔ)的工作就是:把匹配部分進(jìn)行抽象。此外,在具體實(shí)現(xiàn)過(guò)程中也有較多的優(yōu)化,就不一一列出來(lái)了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Java 簡(jiǎn)介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚(yú)_t_閱讀 4,562評(píng)論 1 44
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,679評(píng)論 0 4
  • 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的 JavaScript 類型 使用基本類型和基本包裝類型 引用類型的...
    悶油瓶小張閱讀 779評(píng)論 0 0
  • 昨天看了一個(gè)繪本,叫《我想吃一個(gè)小孩》,想看的親在網(wǎng)上就可以找到哦。 仁者見(jiàn)仁,或許很多人說(shuō)這是一只壞鱷魚(yú),可...
    Amy賈兒閱讀 397評(píng)論 0 0
  • 暮靄橫空晚鴉鳴, 獨(dú)倚危樓月漸明。 夢(mèng)里流年春花舞, 鏡中風(fēng)光秋發(fā)生。 碧岑依稀隔云樹(shù), 寒色滿徑少人行。 邯鄲夢(mèng)...
    林文信閱讀 204評(píng)論 2 5

友情鏈接更多精彩內(nèi)容