非常有用的字符串工具,包括分割、连接、填充等操作

本文简单介绍了一下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(“,”) 返回?

  1. “”, “a”, “”, “b”, “”
  2. null, “a”, null, “b”, null
  3. “a”, null, “b”
  4. “a”, “b”
  5. 以上都不对

正确答案是 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。 所有这些方法指向两个概念上的问题:

  1. 怎么才算匹配字符?
  2. 如何处理这些匹配字符?

为了收拾这个泥潭,我们开发了 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. 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)

    技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...

  2. Guava学习笔记:简化异常处理的Throwables类

    Guava学习笔记:简化异常处理的Throwables类 参考文章: (1)Guava学习笔记:简化异常处理的Throwables类 (2)https://www.cnblogs.com/peida/ ...

  3. Guava学习笔记(转)

    Guava(瓜娃)学习笔记 Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitiv ...

  4. Qt学习笔记之 字符串类型小结

    1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...

  5. Python学习笔记--Python字符串连接方法总结

    声明: 这些总结的学习笔记,一部分是自己在工作学习中总结,一部分是收集网络中的知识点总结而成的,但不到原文链接.如果有侵权,请知会,多谢. python中有很多字符串连接方式,总结一下: 1)最原始的 ...

  6. Guava学习笔记:Google Guava 类库简介

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  7. Google Guava学习笔记——基础工具类Joiner的使用

    Guava 中有一些基础的工具类,如下所列: 1,Joiner 类:根据给定的分隔符把字符串连接到一起.MapJoiner 执行相同的操作,但是针对 Map 的 key 和 value. 2,Spli ...

  8. Guava学习笔记:缘起

    缘起 为什么要使用Guava呢?因为在几年前就是用过Guava的部分功能,当时有一个项目需要通过缓存来提升部分功能的性能,对本地应用缓存和分布式应用缓存进行了相关的调研,在调研本地应用缓存的时候,第一 ...

  9. Python学习笔记:字符串和编码

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. ui动效 unity_Unity - UIWidgets 2. 控件组合
  2. 大厂动态规划面试汇总,提升内功
  3. hashmap的get查找过程
  4. 获得2007年度的ISA-SERVER MVP
  5. python装饰器的顺序_python中多个装饰器的执行顺序详解
  6. 怎样用mysql查询测试_如何测试数据库查询优化器
  7. Github上好的Android开源框架
  8. 批处理实现—循环Ping指定网段(检测网络时使用)
  9. java index.jsp为什么不默认跳转_Java开发人员怎么面试 常见Redis面试题有哪些
  10. 如何更新 Ubuntu Linux
  11. win8.1硬盘安装ubuntu14.04双系统
  12. android 系统相册调用,各版本的区别总结
  13. 在Carmaker中建立自己的交通环境
  14. 无线摄像头服务器关闭,监控摄像头服务器停止
  15. 基于Python的文字生成图片系统
  16. word域转换html,word域代码转换html丢失解决办法.docx
  17. 示波器的实时采样和等效采样
  18. PS磨皮—高低频磨皮
  19. Python Scrapy爬虫框架详解
  20. Vue实现附件上传功能

热门文章

  1. 地方时与世界时的转换问题
  2. Skype for business企业语音配置之七 设置呼叫转接
  3. 三菱伺服MR-JE-C与三菱FX-5UPLC进行两轴CCLINK-Basic总线通信程序
  4. 小微助手是真的吗?小微助手下载
  5. 京东刷关键词搜索点击软件作者,请问这个软件作者有谁认识吗,
  6. hive 插入数据映射到hbase_年薪50万都难招的大数据工程师,凭什么?
  7. Android 初识Retrofit
  8. mysql 存过 if_MySQL IF ELSEIF ELSE语句如何在存储过程中使用?
  9. 2022江苏连云港市东海县招聘社区职业化工作者考试试题及答案
  10. php对接苹果cms采集接口,苹果cms的资讯采集api接口以及使用教程