您的位置 首页 java

Guava之字符串连接,分割,匹配处理

Guava 字符串 的处理

前言

Joiner 字符串连接器

字符串连接器,从名字上就可以知道就是将多个字符串即字符串集连接起来,在Java 8中也有一个StringJoiner,也是连接字符串的一个工具类。我们就先了解了解Java 8自带的这个是怎么操作的吧。

方法 说明 所属
StringJoiner.setEmptyValue(String) 设置字符串为null时的默认值 StringJoiner
StringJoiner.add(String/ char Sequence) 连接字符串 StringJoiner
StringJoiner.merge(StringJoiner) 合并字符串连接器 StringJoiner
Joiner.on(String) 设置Joiner的连接器的分隔符 Joiner
Joiner.join(Iterator/Iterable/Object[]/Object …) 连接字符串 Joiner
Joiner.skipNulls() 跳过为null的字符串 Joiner
Joiner.useForNull(String) 将传入的字符串用于为null的字符串 Joiner
Joiner.append(???) 拼接字符串,返回值为appendable或者StringBuilder Joiner

代码如下:

StringJoiner stringJoiner = new StringJoiner(",");
stringJoiner.setEmptyValue("default").add("111").add("222").add("333");
System.out.println("连接后的字符串:" + stringJoiner. toString ());
StringJoiner stringJoiner1 = new StringJoiner(",");
stringJoiner1.setEmptyValue("default");
System.out.println("字符串为null的时候输出默认值:" + stringJoiner1.toString());
stringJoiner1.merge(stringJoiner);
System.out.println("合并过后输出结果为:" + stringJoiner1.toString());
System.out.println("合并过后长度为:" + stringJoiner1.length()); 

输出结果如下:

Java 8里面字符串的连接器的方法就是这么多,那么我们来看看Guava中的Joiner连接器

代码如下:

Joiner joiner = Joiner.on(",");
String joinString = joiner.join("1", "2", "3", '4');
System.out.println("连接后的字符串:" + joinString);
joiner = Joiner.on(",").skipNulls();
joinString = joiner.join("1", "2", null,"3", '4');
System.out.println("连接并跳过为null的字符串:" + joinString);
joiner = Joiner.on(",").useForNull("default");
joinString = joiner.join("1", "2", null,"3", '4');
System.out.println("连接并设置null的默认值的字符串:" + joinString); 

输出结果如下:

从上述得出,两者有一点小差异。总的说来Guava的好用点,不用一个一个的添加。

Splitter 分割器

不仅分割字符串,还分割对象。但多用于字符串的分割。想想java里面字符串也有分割的功能啊,就是String.split(“分隔符”)但是有点区别,因为游戏时候split会丢弃空字符串的。Spiltter这点做的很好,也会自动给你补充。

方法 说明
Splitter.on(char) 传入的单个字符作为分隔符进行拆分
Splitter.on(CharMatcher) 传入的分字符匹配器拆分
Splitter.on(String) 传入的字符串作为分隔符进行拆分
Splitter.on( Pattern ) 按照 正则表达式 进行拆分
Splitter.onPattern(String) 按照正则表达式进行拆分
Splitter.fixedLength(int) 按照固定长度进行拆分。最后一段可能比给定长度短,但不会为空。
omitEmptyStrings() 从结果中自动忽略空字符串
trimResults() 移除结果字符串的前导空白和尾部空白
trimResults(CharMatcher) 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
limit(int) 限制拆分出的字符串数量

代码如下:

Iterable<String> strings = Splitter.on(',')
 .trimResults()
 .omitEmptyStrings()
 .split("1,2,3,4,5,6,7,8,9,0");
 System.out.println(strings);
 strings = Splitter.on(CharMatcher.anyOf(","))
 .trimResults(CharMatcher.anyOf("1"))
 .omitEmptyStrings()
 .split("1,2,3,4,5,6,7,8,9,0");
 System.out.println(strings);
 strings = Splitter.on(",")
 .omitEmptyStrings()
 .limit(3)
 .split("1,2,3,4,5,6,7,8,9,0");
 System.out.println(strings);
 strings = Splitter.on(Pattern.compile(","))
 .omitEmptyStrings()
 .split("1,2,3,4,5,6,7,8,9,0");
 System.out.println(strings);
 strings = Splitter.onPattern(",")
 .omitEmptyStrings()
 .limit(4)
 .split("1,2,3,4,5,6,7,8,9,0");
 System.out.println(strings); 

输出结果如下:

注意:上面输出结果中的 限制拆分出的字符串数量 的输出时候,看字符串与字符串之间的间隔就可以看出来有几个字符串。不要搞混了啊。

CharMatcher 字符匹配

CharMatcher是用于处理字符匹配的一个工具类,它提供了很多方法。如:字符的修剪,折叠,移除,保留等。但是是有限制的,CharMatcher只能处理char类型的为代表的字符。不能处理0x10000到0x10FFFF的Unicode 增补字符。这些逻辑字符以代理对[surrogate pairs]的形式编码进字符串,而CharMatcher只能将这种逻辑字符看待成两个独立的字符。并且CharMatcher里面也有很多字符匹配器,所以在平时开发过程中基本上都不需要自己建立匹配器的。绝大部分都能使用自带的。其实内部实现是通过正则表达式。CharMatcher里面的字符匹配器如下表:注意这些匹配器都为静态常量,现在都弃用,全部改为相对应的静态方法来获取

匹配器 说明
ANY 匹配任何字符
NONE 不匹配所有字符
WHITESPACE 匹配所有空白字符
BREAKING_WHITESPACE 匹配所有可换行的空白字符(不包括非换行空白字符,例如”\u00a0”)
INVISIBLE 匹配所有看不见的字符
DIGIT 匹配ASCII数字
JAVA_LETTER 匹配字母, 使用 Charater.isLetter() 实现
JAVA_DIGIT 匹配UNICODE数字, 使用 Character.isDigit() 实现
JAVA_LETTER_OR_DIGIT 上两列结合
JAVA_ISO_CONTROL 匹配ISO控制字符, 使用 Charater.isISOControl() 实现
JAVA_LOWER_CASE 匹配小写
JAVA_UPPER_CASE 匹配大写
ASCII 匹配是否是ASCII字符
SINGLE_WIDTH 匹配单字宽字符, 如中文字就是双字宽

其中包含的方法有如下变:上述对应的静态方法就不列举,只列举不对应的方法

方法名 说明
CharMatcher.anyOf(CharSequence) 匹配传入的任何一个字符
CharMatcher.is(char) 给定单一字符匹配
CharMatcher.inRange(char, char) 给定字符范围匹配
removeFrom(CharSequence) 移除匹配到的字符并返回
negate() 返回以当前Matcher判断规则相反的Matcher
and(CharMatcher) 返回与other匹配条件组合做与来判断的Matcher
or(CharMatcher) 返回与other匹配条件组合做或来判断的Matcher
matchesAnyOf(CharSequence) 只要sequence中有任意字符能匹配Matcher,返回true
matchesAllOf(CharSequence) sequence中所有字符都能匹配Matcher,返回true
matchesNoneOf(CharSequence) sequence中所有字符都不能匹配Matcher,返回true
indexIn(CharSequence) 返回sequence中匹配到的第一个字符的坐标
indexIn(CharSequence, int) 返回从start开始,在sequence中匹配到的第一个字符的坐标
lastIndexIn(CharSequence sequence) 返回sequence中最后一次匹配到的字符的坐标
countIn(CharSequence sequence) 返回sequence中匹配到的字符计数
removeFrom(CharSequence) 删除sequence中匹配到到的字符并返回
retainFrom(CharSequence) 保留sequence中匹配到的字符并返回
replaceFrom(CharSequence, char) 替换sequence中匹配到的字符并返回
trimFrom(CharSequence) 删除首尾匹配到的字符并返回
trimLeadingFrom(CharSequence) 删除首部匹配到的字符
trimTrailingFrom(CharSequence) 删除尾部匹配到的字符
collapseFrom(CharSequence, char) 将匹配到的组(连续匹配的字符)替换成replacement
trimAndCollapseFrom(CharSequence, char) 先trim在replace

代码如下:

 System.out.println(CharMatcher.DIGIT.retainFrom("hehehheheh123"));
//对应于下面这一句
System.out.println(CharMatcher.digit().retainFrom("hehehheheh123"));
//将tab替换为空格
System.out.println(CharMatcher.whitespace().trimAndCollapseFrom(" Mahesh Parashar ", ' '));
//将数字替换为*
System.out.println(CharMatcher.javaDigit().replaceFrom("mahesh123", "*"));
//匹配小写
System.out.println(CharMatcher.javaDigit().or(CharMatcher.JAVA_LOWER_CASE).retainFrom("mahesh123")); 

输出结果如下:

Charsets 字符集

Charsets针对所有Java平台都要保证支持的六种字符集提供了常量引用。尝试使用这些常量,而不是通过名称获取字符集实例。其中六种字符集分别为:ISO_8859_1,UTF_8,UTF_16BE,UTF_16LE,US_ASCII,UTF_16。

代码实例:

bytes = string.getBytes(Charsets.UTF_8); 

CaseFormat 大小写格式

CaseFormat被用来方便地在各种ASCII大小写规范间转换字符串——比如,编程语言的命名规范。我们CaseFormat在某些时候尤其有用,比如编写代码生成器的时候。其中大小写格式分为:LOWER_HYPHEN(连字符连接变量的命名规则),LOWER_UNDERSCORE(C ++变量命名规则),LOWER_CAMEL(Java变量的命名规则)UPPER_CAMEL(Java和C++类的命名规则),UPPER_UNDERSCORE(Java和C++常量的命名规则)。

代码如下:

System.out.println(CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, "test-data"));
System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "test_data"));
System.out.println(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "test_data"));
System.out.println(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "testdata"));
System.out.println(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "TestData"));
System.out.println(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, "testData")); 

输出如下:

testData
testData
TestData
testdata
test_data
test-data 

Strings 字符串相关处理工具类

Strings是guava对字符串操作的封装,包括判断字符串是否为空,取字符串的相同前缀,后缀,以及补全字符串;连接字符串,拆分字符串和补全等常用的字符串的操作。

  • 方法介绍:

方法名 说明
commonSuffix(CharSequence,CharSequence) 获取字符串相同的后缀。没有则为空字符串
isNullOrEmpty(String) 判断是否为null或者空字符串
commonPrefix(CharSequence,CharSequence) 获取字符串相同的前缀。没有则为空字符串
nullToEmpty(String) 如果字符串为null就转为空字符串,不为null就直接返回
emptyToNull(String) 如果字符串为空字符串就转为null,不为空字符串就直接返回
padEnd(String,int, char) 如果字符串长度不够最小的长度就用传入的字符补全到字符串末尾
padStart(String,int, char) 如果字符串长度不够最小的长度就用传入的字符补全到字符串开始
repeat(String,int) 重复拼接传入的字符串传入的次数

代码如下:

String a = "World,Hello";
String b = "Google,Hello";
String c = "Hello,World";
String d = "Hello,Google";
System.out.println(Strings.commonSuffix(a,b));
System.out.println(Strings.isNullOrEmpty(a));
System.out.println(Strings.isNullOrEmpty(""));
System.out.println(Strings.isNullOrEmpty(null));
System.out.println(Strings.commonPrefix(c,d));
System.out.println(Strings.emptyToNull(a));
System.out.println(Strings.nullToEmpty(a));
System.out.println(Strings.padEnd("123",5,'a'));
System.out.println(Strings.padStart("123",5,'a'));
System.out.println(Strings.repeat("123",5)); 

输出如下:

总结

Guava对字符串的处理是非常得不错,很多JDK中没有得都考虑到了,甚至在后续JDK升级得时候都添加了很多Guava中得精华部分。字符串对于项目逻辑来说,有时是难免得,但是我们可以尽量让代码从简,优化逻辑,让自己得代码可读性增强。所以guava得初衷就是如此,并且guava对null是非常敏感得,因为null对于一个以java为开发语言的工程师来说是非常头痛的并且是不可避免会遇到的。在运用的时候如果只是部分功能需要的话,建议你不要添加guava的依赖或者jar包,毕竟这个框架涉及得比较广泛且包是非常的大,需要你将里面得类或者相关代码拿出来作为你自己得工具类。以这样得参考方法为案例是非常不错的。

文章来源:智云一二三科技

文章标题:Guava之字符串连接,分割,匹配处理

文章地址:https://www.zhihuclub.com/186599.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图