Guava学习之CharMatcher

本文是对 Guava 中 CharMatcher 的学习介绍。欢迎加入学习项目: LearningGuava

以下参考:

概览

之前,Guava 中的 StringUtil 在无节制地增长,具有很多方法,如:

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

这些函数本质上是以下两个方面的乘积(M x N 种情况):

  1. 何如定义一个“匹配”的字符? (M 种情况)
  2. 对“匹配”的字符进行怎样的操作? (N 种情况)

为了解决这样的爆炸式增长,Guava 提供了 CharMatcher。一个 CharMacher 实例本身,界定了一个匹配字符的集合,而 CharMacher 实例的方法,解决了要对匹配字符做什么的问题。然后我们就可以用最小化的 API 来处理字符匹配和字符操作,把 M×N 的复杂度下降到了 M+N

直观地说,你可以把 CharMatcher 看做是一些特别字符串的表示,例如:数字、空格等。而事实上,CharMatcher 只是一个针对字符串的布尔断言(它实现了 Predicate<Character>),但考虑到“所有空白字符串”、“所有小写单词”等相关需求是很普遍的,Guava 还是为字符串提供了专门的语法和 API。

CharMatcher 的功能主要在于对特定类或字符串执行这些操作:trimmingcollapsingremovingretaining 等。

使用示例

创建 CharMatcher

很多需求都可以被 CharMatcher 的工厂方法满足:

其它一些常用的获得一个 CharMatcher 的方法包括:

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

此外,CharMatcher 还有这些方法:negate()and(CharMatcher)or(CharMatcher)。这些方法可以为 CharMatcher 提供方便的布尔运算。

使用 CharMatcher

CharMatcher 提供了很多方法来对匹配的字符序列 CharSequence 进行操作。以下只是列出了一些常用方法。

方法 描述
collapseFrom(CharSequence, char) 将一组连续匹配的字符串替换为一个指定的字符。例如:WHITESPACE.collapseFrom(string, ' ') 可以将连续的空字符串替换为单个字符。
matchesAllOf(CharSequence) 测试字符序列是否全部匹配。例如:ASCII.matchesAllOf(string) 可以测试字符是否全部是 ASCII。
removeFrom(CharSequence) 将匹配的字符序列移除
retainFrom(CharSequence) 将没有匹配的字符序列移除
trimFrom(CharSequence) 去除开头和结尾匹配的部分
replaceFrom(CharSequence, CharSequence) 将匹配的字符替换为给定的序列

方法分类

根据函数的返回值和名称将这些方法分为三类。

第一类是判定型函数,判断 CharMacher 和入参字符串的匹配关系。

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

第二类是计数型函数,查找入参字符串中第一次、最后一次出现目标字符的位置,或者目标字符出现的次数,比如 indexInlastIndexIncountIn

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

第三类就是对匹配字符的操作。包括 removeFromretainFromreplaceFromtrimFromcollapseFrom 等。

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

源码分析

源码有很多行,主要的逻辑是这样的:

  • CharMatcher 是个抽象类,内部有一些私有的实现类,通过一些工厂函数 isanyOf 等工厂函数创建对应的实例(固定的是单例,变化的会创建一个具体实例)。
  • 不同的实例主要实现的是 CharMatcher 中的 matches 方法,这样就实现了不同策略的匹配器。
  • 基于上述匹配方法 matches,可以进行统计工作(countIn等)、查找工作(indexIn等)、修改工作(trimFrom)等。

这样的设计最基础的工作就是:把匹配部分进行抽象。此外,在具体实现过程中也有较多的优化,就不一一列出来了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,148评论 1 44
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,205评论 0 4
  • 本章内容 使用对象 创建并操作数组 理解基本的 JavaScript 类型 使用基本类型和基本包装类型 引用类型的...
    闷油瓶小张阅读 674评论 0 0
  • 昨天看了一个绘本,叫《我想吃一个小孩》,想看的亲在网上就可以找到哦。 仁者见仁,或许很多人说这是一只坏鳄鱼,可...
    Amy贾儿阅读 357评论 0 0
  • 暮霭横空晚鸦鸣, 独倚危楼月渐明。 梦里流年春花舞, 镜中风光秋发生。 碧岑依稀隔云树, 寒色满径少人行。 邯郸梦...
    林文信阅读 181评论 2 5