Guava学习笔记 6. 字符串处理[Strings]
非常有用的字符串工具,包括分割、连接、填充等操作
本文简单介绍了一下Guava的一些字符串工具
本文参考自:
http://ifeve.com/google-guava-strings/
并添加了一些其他测试代码
— By Syahfozy
连接器 [Joiner]
用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦。如果字符串序列中含有 null,那连接操作会更难。Fluent 风格的 Joiner 让连接字符串更简单。
Joiner joiner = Joiner.on("; ").skipNulls();
return joiner.join("Harry", null, "Ron", "Hermione");
上述代码返回”Harry; Ron; Hermione”。另外,useForNull(String) 方法可以给定某个字符串来替换 null,而不像 skipNulls() 方法是直接忽略 null。
joiner = Joiner.on("; ").useForNull("null");
str = joiner.join("Harry", null, "Ron", "Hermione");
即这里的返回结果是Harry; null; Ron; Hermione
Joiner 也可以用来连接对象类型,在这种情况下,它会把对象的 toString() 值连接起来。
Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7"
警告:joiner 实例总是不可变的。用来定义 joiner 目标语义的配置方法总会返回一个新的 joiner 实例。这使得 joiner 实例都是线程安全的,你可以将其定义为 static final 常量。
拆分器 [Splitter]
JDK 内建的字符串拆分工具有一些古怪的特性。比如,String.split 悄悄丢弃了尾部的分隔符。 问题:”,a,b,”.split(“,”) 返回?
- “”, “a”, “”, “b”, “”
- null, “a”, null, “b”, null
- “a”, null, “b”
- “a”, “b”
- 以上都不对
正确答案是 5:””, “a”, “”, “b”。只有尾部的空字符串被忽略了。 Splitter 使用令人放心的、直白的流畅 API 模式对这些混乱的特性作了完全的掌控。
// 按单个字符拆分Iterable<String> strings = Splitter.on(',').trimResults().omitEmptyStrings().split("foo,bar,, qux");// [foo, bar, qux]
上述代码返回 Iterable,其中包含”foo”、”bar” 和”qux”。Splitter 可以被设置为按照任何模式、字符、字符串或字符匹配器拆分。
按字符匹配器拆分
// 按字符匹配器拆分strings = Splitter.on(CharMatcher.whitespace()).trimResults().omitEmptyStrings().split("foo bar qux,qq");// [foo, bar, qux,qq]System.out.println(strings);
按字符串拆分
// 按字符串拆分strings = Splitter.on("ab").trimResults().omitEmptyStrings().split("fooabbarabaux");// [foo, bar, aux]System.out.println(strings);
// 按正则表达式拆分strings = Splitter.onPattern("\\/").trimResults().omitEmptyStrings().split("foo/abb /ara b ");// [foo, abb, ara b]System.out.println(strings);strings = Splitter.on(Pattern.compile("\\.")).trimResults().omitEmptyStrings().split("foo.bar.qux");// [foo, bar, qux]System.out.println(strings);
// 按固定长度拆分;最后一段可能比给定长度短,但不会为空strings = Splitter.fixedLength(2).split("foo bar");// [fo, o , ba, r]System.out.println(strings);
拆分器工厂
方法 | 描述 | 范例 |
Splitter.on(char) | 按单个字符拆分 | Splitter.on(‘;’) |
Splitter.on(CharMatcher) | 按字符匹配器拆分 | Splitter.on(CharMatcher.BREAKING_WHITESPACE) |
Splitter.on(String) | 按字符串拆分 | Splitter.on(“, “) |
Splitter.on(Pattern) Splitter.onPattern(String) | 按正则表达式拆分 | Splitter.onPattern(“\r?\n”) |
Splitter.fixedLength(int) | 按固定长度拆分;最后一段可能比给定长度短,但不会为空。 | Splitter.fixedLength(3) |
拆分器修饰符
方法 | 描述 |
omitEmptyStrings() | 从结果中自动忽略空字符串 |
trimResults() | 移除结果字符串的前导空白和尾部空白 |
trimResults(CharMatcher) | 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 |
limit(int) | 限制拆分出的字符串数量 |
如果你想要拆分器返回 List,只要使用 Lists.newArrayList(splitter.split(string)) 或类似方法。 警告:splitter 实例总是不可变的。用来定义 splitter 目标语义的配置方法总会返回一个新的 splitter 实例。这使得 splitter 实例都是线程安全的,你可以将其定义为 static final 常量。
字符匹配器 [CharMatcher]
在以前的 Guava 版本中,StringUtil 类疯狂地膨胀,其拥有很多处理字符串的方法:allAscii、collapse、collapseControlChars、collapseWhitespace、indexOfChars、lastIndexNotOf、numSharedChars、removeChars、removeCrLf、replaceChars、retainAllChars、strip、stripAndCollapse、stripNonDigits。 所有这些方法指向两个概念上的问题:
- 怎么才算匹配字符?
- 如何处理这些匹配字符?
为了收拾这个泥潭,我们开发了 CharMatcher。
直观上,你可以认为一个 CharMatcher 实例代表着某一类字符,如数字或空白字符。事实上来说,CharMatcher 实例就是对字符的布尔判断——CharMatcher 确实也实现了 Predicate——但类似” 所有空白字符” 或” 所有小写字母” 的需求太普遍了,Guava 因此创建了这一 API。
然而使用 CharMatcher 的好处更在于它提供了一系列方法,让你对字符作特定类型的操作:修剪 [trim]、折叠[collapse]、移除[remove]、保留[retain] 等等。CharMatcher 实例首先代表概念 1:怎么才算匹配字符?然后它还提供了很多操作概念 2:如何处理这些匹配字符?这样的设计使得 API 复杂度的线性增加可以带来灵活性和功能两方面的增长。
注:CharMatcher 只处理 char 类型代表的字符;它不能理解 0x10000 到 0x10FFFF 的 Unicode 增补字符。这些逻辑字符以代理对 [surrogate pairs] 的形式编码进字符串,而 CharMatcher 只能将这种逻辑字符看待成两个独立的字符。
参考使用代码:
/*** 字符匹配器[CharMatcher]*/String string = "\u0009666 and sb ";// 666 and sbSystem.out.println(string);// 移除control字符String noControl = CharMatcher.javaIsoControl().removeFrom(string);// 666 and sbSystem.out.println(noControl);// 去除两端的空格,并把中间的连续空格替换成单个空格String spaced = CharMatcher.whitespace().collapseFrom(string, ' ');// 666 and sbSystem.out.println(spaced);// 只保留数字字符String theDigits = CharMatcher.inRange('0', '9').retainFrom(string);// 666System.out.println(theDigits);// 用*号替换所有数字String noDigits = CharMatcher.inRange('0', '9').replaceFrom(string, "*");// *** and sbSystem.out.println(noDigits);// 只保留数字和小写字母String lowerAndDigit = CharMatcher.inRange('0', '9').or(CharMatcher.inRange('a', 'z')).retainFrom(string);// 666andsbSystem.out.println(lowerAndDigit);
获取字符匹配器
CharMatcher 中的常量可以满足大多数字符匹配需求:
ANY | NONE | WHITESPACE | BREAKING_WHITESPACE |
INVISIBLE | DIGIT | JAVA_LETTER | JAVA_DIGIT |
JAVA_LETTER_OR_DIGIT | JAVA_ISO_CONTROL | JAVA_LOWER_CASE | JAVA_UPPER_CASE |
ASCII | SINGLE_WIDTH |
其他获取字符匹配器的常见方法包括:
方法 | 描述 |
anyOf(CharSequence) | 枚举匹配字符。如 CharMatcher.anyOf(“aeiou”) 匹配小写英语元音 |
is(char) | 给定单一字符匹配。 |
inRange(char, char) | 给定字符范围匹配,如 CharMatcher.inRange(‘a’, ‘z’) |
此外,CharMatcher 还有 negate()、and(CharMatcher) 和 or(CharMatcher) 方法。
使用字符匹配器
CharMatcher 提供了多种多样的方法操作 CharSequence 中的特定字符。其中最常用的罗列如下:
方法 | 描述 |
collapseFrom(CharSequence, char) | 把每组连续的匹配字符替换为特定字符。如 WHITESPACE.collapseFrom(string, ‘ ‘) 把字符串中的连续空白字符替换为单个空格。 |
matchesAllOf(CharSequence) | 测试是否字符序列中的所有字符都匹配。 |
removeFrom(CharSequence) | 从字符序列中移除所有匹配字符。 |
retainFrom(CharSequence) | 在字符序列中保留匹配字符,移除其他字符。 |
trimFrom(CharSequence) | 移除字符序列的前导匹配字符和尾部匹配字符。 |
replaceFrom(CharSequence, CharSequence) | 用特定字符序列替代匹配字符。 |
所有这些方法返回 String,除了 matchesAllOf 返回的是 boolean。
字符集 [Charsets]
不要这样做字符集处理:
试试这样写:
Charsets 针对所有 Java 平台都要保证支持的六种字符集提供了常量引用。尝试使用这些常量,而不是通过名称获取字符集实例。
大小写格式 [CaseFormat]
CaseFormat 被用来方便地在各种 ASCII 大小写规范间转换字符串——比如,编程语言的命名规范。CaseFormat 支持的格式如下:
格式 | 范例 |
LOWER_CAMEL | lowerCamel |
LOWER_HYPHEN | lower-hyphen |
LOWER_UNDERSCORE | lower_underscore |
UPPER_CAMEL | UpperCamel |
UPPER_UNDERSCORE | UPPER_UNDERSCORE |
CaseFormat 的用法很直接:
String lowerCamel = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME");// constantName
System.out.println(lowerCamel);
我们 CaseFormat 在某些时候尤其有用,比如编写代码生成器的时候。
Guava学习笔记 6. 字符串处理[Strings]相关推荐
- 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...
- Guava学习笔记:简化异常处理的Throwables类
Guava学习笔记:简化异常处理的Throwables类 参考文章: (1)Guava学习笔记:简化异常处理的Throwables类 (2)https://www.cnblogs.com/peida/ ...
- Guava学习笔记(转)
Guava(瓜娃)学习笔记 Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitiv ...
- Qt学习笔记之 字符串类型小结
1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...
- Python学习笔记--Python字符串连接方法总结
声明: 这些总结的学习笔记,一部分是自己在工作学习中总结,一部分是收集网络中的知识点总结而成的,但不到原文链接.如果有侵权,请知会,多谢. python中有很多字符串连接方式,总结一下: 1)最原始的 ...
- Guava学习笔记:Google Guava 类库简介
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- Google Guava学习笔记——基础工具类Joiner的使用
Guava 中有一些基础的工具类,如下所列: 1,Joiner 类:根据给定的分隔符把字符串连接到一起.MapJoiner 执行相同的操作,但是针对 Map 的 key 和 value. 2,Spli ...
- Guava学习笔记:缘起
缘起 为什么要使用Guava呢?因为在几年前就是用过Guava的部分功能,当时有一个项目需要通过缓存来提升部分功能的性能,对本地应用缓存和分布式应用缓存进行了相关的调研,在调研本地应用缓存的时候,第一 ...
- Python学习笔记:字符串和编码
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
最新文章
- ui动效 unity_Unity - UIWidgets 2. 控件组合
- 大厂动态规划面试汇总,提升内功
- hashmap的get查找过程
- 获得2007年度的ISA-SERVER MVP
- python装饰器的顺序_python中多个装饰器的执行顺序详解
- 怎样用mysql查询测试_如何测试数据库查询优化器
- Github上好的Android开源框架
- 批处理实现—循环Ping指定网段(检测网络时使用)
- java index.jsp为什么不默认跳转_Java开发人员怎么面试 常见Redis面试题有哪些
- 如何更新 Ubuntu Linux
- win8.1硬盘安装ubuntu14.04双系统
- android 系统相册调用,各版本的区别总结
- 在Carmaker中建立自己的交通环境
- 无线摄像头服务器关闭,监控摄像头服务器停止
- 基于Python的文字生成图片系统
- word域转换html,word域代码转换html丢失解决办法.docx
- 示波器的实时采样和等效采样
- PS磨皮—高低频磨皮
- Python Scrapy爬虫框架详解
- Vue实现附件上传功能
热门文章
- 地方时与世界时的转换问题
- Skype for business企业语音配置之七 设置呼叫转接
- 三菱伺服MR-JE-C与三菱FX-5UPLC进行两轴CCLINK-Basic总线通信程序
- 小微助手是真的吗?小微助手下载
- 京东刷关键词搜索点击软件作者,请问这个软件作者有谁认识吗,
- hive 插入数据映射到hbase_年薪50万都难招的大数据工程师,凭什么?
- Android 初识Retrofit
- mysql 存过 if_MySQL IF ELSEIF ELSE语句如何在存储过程中使用?
- 2022江苏连云港市东海县招聘社区职业化工作者考试试题及答案
- php对接苹果cms采集接口,苹果cms的资讯采集api接口以及使用教程