对字符串的处理应该是编程活动中最频繁的操作了,而原生的 JDK 以及 Java 本身的语法特性使得在 Java 中进行字符串操作是一件极其麻烦的事情,如果你熟悉 Shell/Awk/Sed/Perl/Python 等脚本语言,你就大概能明白我说的啥意思了。
上次在这篇 使用 Google Guava 美化你的 Java 代码:1~4 中介绍过一些利用 Guava 库进行字符串操作的例子,限于篇幅与内容,介绍的比较泛,今天就单独的聊聊 Guava 中的 CharMatcher 类,并结合一些常见的需求来进行解说。
CharMatcher提供了多种对字符串处理的方法, 它的主要意图有:
1. 找到匹配的字符
2. 处理匹配的字符
CharMatcher 的内部实现主要包括两部分:
1. 实现了大量公用内部类, 用来方便用户对字符串做匹配: 例如 JAVA_DIGIT 匹配数字, JAVA_LETTER 匹配字母等等。
2. 实现了大量处理字符串的方法, 使用特定的CharMatcher可以对匹配到的字符串做出多种处理, 例如 remove(), replace(), trim(), retain()等等。
CharMatcher本身是一个抽象类, 其中一些操作方法是抽象方法, 他主要依靠内部继承CharMatcher的内部子类来实现抽象方法和重写一些操作方法, 因为不同的匹配规则的这些操作方法具有不同的实现要求。
CharMatcher.WHITESPACE (Java whitespace character)
CharMatcher.JAVA_DIGIT
CharMatcher.JAVA_LETTER
CharMatcher.JAVA_LOWER_CASE
CharMatcher.JAVA_UPPER_CASE
CharMatcher.ASCII
CharMatcher.ANY
...
String str = "FirstName LastName +1 123 456 789 !@#$%^&*()_+|}{:\"?><"; // Use a predefined constant (predefine CharMatcher) CharMatcher.DIGIT.retainFrom(str); Output:-> "1123456789" CharMatcher.JAVA_LETTER.retainFrom(str); Output:-> "FirstNameLastName" CharMatcher.JAVA_LETTER_OR_DIGIT.retainFrom(str); Output:-> "FirstNameLastName1123456789" CharMatcher.ANY.countIn(str) Output:-> 54 CharMatcher.DIGIT.countIn(str); Output:-> 10
CharMatcher.is('x')
CharMatcher.isNot('_')
CharMatcher.oneOf("aeiou").negate()
CharMatcher.inRange('a', 'z').or(inRange('A', 'Z'))
...
使用条件组合:
CharMatcher and(CharMatcher other)
CharMatcher or(CharMatcher other)
CharMatcher negate()
String str = "FirstName LastName +1 123 456 789 !@#$%^&*()_+|}{:\"?><"; CharMatcher.JAVA_LOWER_CASE.negate().retainFrom(str); Output:-> "FN LN +1 123 456 789 !@#$%^&*()_+|}{:\"?><" CharMatcher.JAVA_DIGIT.or(CharMatcher.anyOf("aeiou")).retainFrom(str); Output:-> "iaeaae1123456789"
//原字符串 System.out.println(string); //去掉控制字符(\t,\n,\b...) System.out.println(CharMatcher.JAVA_ISO_CONTROL.removeFrom(string)); //获取所有的数字 System.out.println(CharMatcher.DIGIT.retainFrom(string)); //把多个空格替换为一个包括\t,并去掉首位的空格 System.out.println(CharMatcher.WHITESPACE.trimAndCollapseFrom(string, ' ')); //把所有的数字用"*"代替 System.out.println(CharMatcher.JAVA_DIGIT.replaceFrom(string, "*")); //获取所有的数字和小写字母 System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(string)); //获取所有的大写字母 System.out.println(CharMatcher.JAVA_UPPER_CASE.retainFrom(string)); //获取所有单字节长度的符号 System.out.println(CharMatcher.SINGLE_WIDTH.retainFrom(string)); /* 原字符串: ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好 234啊 GES 去掉控制字符(\t,\n,\b...): ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好234啊 GES 获取所有的数字: 23234 把多个空格替换为一个包括\t,并去掉首位的空格: ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好 234啊 GES 把所有的数字用"*"代替: ROCKY rocky RoCkY ~!@#$%^&*() **(*&gS 你好 ***啊 GES 获取所有的数字和小写字母: rockyok23g234 获取所有的大写字母: ROCKYRCYSGES 获取所有单字节长度的符号: ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 234 GES */
需要说明的是 CharMatcher 并没有提供以正则表达式作为匹配条件的方法,
你可以参考:
http://stackoverflow.com/questions/12378702/how-to-write-the-charmatcher-equivalent-for-the-regex-word-character
http://blog.csdn.net/firecoder/article/details/5827281 七种武器:Collection 之 Google Guava
不过这个例子貌似只能判断字符,而不是字符串。
但是这难不倒我们,别忘了在上篇文章的最后的链接里,我提到了另一个与 guava 类似的库:Apache Commons,相对而言,它的功能更加完善,比如,这个需求,它内置了一个专门的校验类:Validate
try { Validate.matchesPattern("2013-11-241", "\\d{4}-\\d{2}-\\d{2}", "输入的日期格式不正确!"); } catch (Exception e) { System.out.println(e.toString()); // return; } // output: // java.lang.IllegalArgumentException: 输入的日期格式不正确!所以,我个人倾向于把这两个库结合起来用,这样可以大大节约你的开发时间,降低你的代码冗余度。
好吧,就介绍到这里了,如果你也有这块的心得体会,欢迎交流~
http://www.cnblogs.com/zemliu/p/3345087.html#top
http://techneerajnandwana.blogspot.com/2011/11/guava-string-manipulation-with.html
http://blog.csdn.net/rocky225/article/details/8289407
http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/index.html
http://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html