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

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

以下參考:

概覽

之前炼邀,Guava 中的 StringUtil 在無節(jié)制地增長陆错,具有很多方法灯抛,如:

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

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

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

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

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

CharMatcher 的功能主要在于對特定類或字符串執(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 提供了很多方法來對匹配的字符序列 CharSequence 進(jìn)行操作漫拭。以下只是列出了一些常用方法。

方法 描述
collapseFrom(CharSequence, char) 將一組連續(xù)匹配的字符串替換為一個(gè)指定的字符混稽。例如:WHITESPACE.collapseFrom(string, ' ') 可以將連續(xù)的空字符串替換為單個(gè)字符采驻。
matchesAllOf(CharSequence) 測試字符序列是否全部匹配。例如:ASCII.matchesAllOf(string) 可以測試字符是否全部是 ASCII匈勋。
removeFrom(CharSequence) 將匹配的字符序列移除
retainFrom(CharSequence) 將沒有匹配的字符序列移除
trimFrom(CharSequence) 去除開頭和結(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)⒆址械谝淮巍⒆詈笠淮纬霈F(xiàn)目標(biāo)字符的位置饿自,或者目標(biāo)字符出現(xiàn)的次數(shù)汰翠,比如 indexInlastIndexIncountIn昭雌。

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

第三類就是對匹配字符的操作复唤。包括 removeFromretainFrom城豁、replaceFrom苟穆、trimFromcollapseFrom 等唱星。

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)類间聊,通過一些工廠函數(shù) is攒盈、anyOf 等工廠函數(shù)創(chuàng)建對應(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)過程中也有較多的優(yōu)化,就不一一列出來了谆吴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倒源,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子句狼,更是在濱河造成了極大的恐慌笋熬,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腻菇,死亡現(xiàn)場離奇詭異胳螟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芜繁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門旺隙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绒极,“玉大人骏令,你說我怎么就攤上這事÷⑻幔” “怎么了榔袋?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铡俐。 經(jīng)常有香客問我凰兑,道長,這世上最難降的妖魔是什么审丘? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任吏够,我火速辦了婚禮,結(jié)果婚禮上滩报,老公的妹妹穿的比我還像新娘锅知。我一直安慰自己,他們只是感情好脓钾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布售睹。 她就那樣靜靜地躺著,像睡著了一般可训。 火紅的嫁衣襯著肌膚如雪昌妹。 梳的紋絲不亂的頭發(fā)上捶枢,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音飞崖,去河邊找鬼烂叔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛固歪,可吹牛的內(nèi)容都是我干的长已。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昼牛,長吁一口氣:“原來是場噩夢啊……” “哼术瓮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贰健,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤胞四,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后伶椿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辜伟,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年脊另,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了导狡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偎痛,死狀恐怖旱捧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踩麦,我是刑警寧澤枚赡,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站谓谦,受9級特大地震影響贫橙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜反粥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一卢肃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧才顿,春花似錦莫湘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竣贪,卻和暖如春军洼,著一層夾襖步出監(jiān)牢的瞬間巩螃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工匕争, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留避乏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓甘桑,卻偏偏與公主長得像拍皮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子跑杭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

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