1. 程式人生 > >簡化你的 java 字串操作:Guava 之 CharMatcher 用法簡介

簡化你的 java 字串操作:Guava 之 CharMatcher 用法簡介

對字串的處理應該是程式設計活動中最頻繁的操作了,而原生的 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的內部子類來實現抽象方法和重寫一些操作方法, 因為不同的匹配規則的這些操作方法具有不同的實現要求。

1、預設實現類
CharMatcher本身提供了很多CharMatcher實現類,如下: 
ANY: 匹配任何字元
ASCII: 匹配是否是ASCII字元
BREAKING_WHITESPACE: 匹配所有可換行的空白字元(不包括非換行空白字元,例如"\u00a0")
DIGIT: 匹配ASCII數字 
INVISIBLE: 匹配所有看不見的字元
JAVA_DIGIT: 匹配UNICODE數字, 使用 Character.isDigit() 實現
JAVA_ISO_CONTROL: 匹配ISO控制字元, 使用 Charater.isISOControl() 實現
JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 實現
JAVA_LETTER_OR_DIGET: 匹配數字或字母
JAVA_LOWER_CASE: 匹配小寫
JAVA_UPPER_CASE: 匹配大寫
NONE: 不匹配所有字元
SINGLE_WIDTH: 匹配單字寬字元, 如中文字就是雙字寬
WHITESPACE: 匹配所有空白字元

2、常用操作方法
CharMatcher is(char match): 返回匹配指定字元的Matcher
CharMatcher isNot(char match): 返回不匹配指定字元的Matcher
CharMatcher anyOf(CharSequence sequence): 返回匹配sequence中任意字元的Matcher
CharMatcher noneOf(CharSequence sequence): 返回不匹配sequence中任何一個字元的Matcher
CharMatcher inRange(char startInclusive, char endIncludesive): 返回匹配範圍內任意字元的Matcher
CharMatcher forPredicate(Predicate<? super Charater> predicate): 返回使用predicate的apply()判斷匹配的Matcher
CharMatcher negate(): 返回以當前Matcher判斷規則相反的Matcher
CharMatcher and(CharMatcher other): 返回與other匹配條件組合做與來判斷的Matcher
CharMatcher or(CharMatcher other): 返回與other匹配條件組合做或來判斷的Matcher
boolean matchesAnyOf(CharSequence sequence): 只要sequence中有任意字元能匹配Matcher,返回true
boolean matchesAllOf(CharSequence sequence): sequence中所有字元都能匹配Matcher,返回true
boolean matchesNoneOf(CharSequence sequence): sequence中所有字元都不能匹配Matcher,返回true
int indexIn(CharSequence sequence): 返回sequence中匹配到的第一個字元的座標
int indexIn(CharSequence sequence, int start): 返回從start開始,在sequence中匹配到的第一個字元的座標
int lastIndexIn(CharSequence sequence): 返回sequence中最後一次匹配到的字元的座標
int countIn(CharSequence sequence): 返回sequence中匹配到的字元計數
String removeFrom(CharSequence sequence): 刪除sequence中匹配到到的字元並返回
String retainFrom(CharSequence sequence): 保留sequence中匹配到的字元並返回
String replaceFrom(CharSequence sequence, char replacement): 替換sequence中匹配到的字元並返回
String trimFrom(CharSequence sequence): 刪除首尾匹配到的字元並返回
String trimLeadingFrom(CharSequence sequence): 刪除首部匹配到的字元
String trimTrailingFrom(CharSequence sequence): 刪除尾部匹配到的字元
String collapseFrom(CharSequence sequence, char replacement): 將匹配到的組(連續匹配的字元)替換成replacement 
String trimAndCollapseFrom(CharSequence sequence, char replacement): 先trim在replace

3、一些栗子:
(1)使用預定義的常量 (predefine 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 [email protected]#$%^&*()_+|}{:\"?><";
// 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

(2)使用工廠方法:
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 [email protected]#$%^&*()_+|}{:\"?><";
 
CharMatcher.JAVA_LOWER_CASE.negate().retainFrom(str);
Output:->
"FN LN +1 123 456 789 [email protected]#$%^&*()_+|}{:\"?><"
 
CharMatcher.JAVA_DIGIT.or(CharMatcher.anyOf("aeiou")).retainFrom(str);
Output:->
"iaeaae1123456789"

(3)一些小例子:
//原字串
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 [email protected]#$%^&*()      23(*&gS   你好	234啊   GES  

去掉控制字元(\t,\n,\b...):
  ROCKY  rocky  RoCkY [email protected]#$%^&*()      23(*&gS   你好234啊   GES  

獲取所有的數字:
23234

把多個空格替換為一個包括\t,並去掉首位的空格:
ROCKY rocky RoCkY [email protected]#$%^&*() 23(*&gS 你好 234啊 GES

把所有的數字用"*"代替:
  ROCKY  rocky  RoCkY [email protected]#$%^&*()      **(*&gS   你好	***啊   GES  

獲取所有的數字和小寫字母:
rockyok23g234

獲取所有的大寫字母:
ROCKYRCYSGES

獲取所有單位元組長度的符號:
  ROCKY  rocky  RoCkY [email protected]#$%^&*()      23(*&gS   	234   GES  
*/


相關推薦

簡化java 字串操作Guava CharMatcher 用法簡介

對字串的處理應該是程式設計活動中最頻繁的操作了,而原生的 JDK 以及 Java 本身的語法特性使得在 Java 中進行字串操作是一件極其麻煩的事情,如果你熟悉 Shell/Awk/Sed/Perl/Python 等指令碼語言,你就大概能明白我說的啥意思了。 上次在這篇 使

java鬼混筆記springbootthymeleaf 2:字串Strings常見的使用方法

動手寫一寫,記一記 <!-- name:ywj --> 字串操作: <span th:text="${name}" /> <hr /> <hr /> 字串拼接: <span th:text="'i am ' + ${na

JavaJava字串操作”實際應用——形成GBK編碼和UTF-8編碼的文字檔案,通過其二進位制資料觀察兩種編碼的不同

一、任務目標     完成一個java application應用程式,可以把GBK編碼的漢字字串與UTF-8編碼的漢字字串相互轉換。並配合寫檔案操作形成不同編碼格式的文字檔案,可以通過其二進位制資料觀察兩種編碼的不同。   二、程式設計思路     博主將“程式設計思路”以流程

java字串操作

一、字串擷取 1.split() 例:String str = "1,2,3,4,5"; String[] strS = str.split(",");(strS = [1,2,3,4,5]) 2.subString(),下標從0開始 例:String str = "abcdef

Java字串操作及與C#字串操作的不同

每種語言都會有字串的操作,因為字串是我們平常開發使用頻率最高的一種型別。今天我們來聊一下Java的字串操作及在某些具體方法中與C#的不同,對於需要熟悉多種語言的人來說,作為一種參考。進行誡勉 首先,什麼是字串? 字串是字元的序列,是作為一種物件而存在。說的直白點,字串就是一些字元的組合,從而構成字串,例如

java字串格式化String.format()方法的使用

常規型別的格式化 String類的format()方法用於建立格式化的字串以及連線多個字串物件。熟悉C語言的讀者應該記得C語言的sprintf()方法,兩者有類似之處。format()方法有兩種過載形式。 l     format(String format, Objec

字串操作擷取表單網址裡的資訊變成物件

字串的方法 1.str.indexOf("?")返回?這個字串的位置,也就是第幾位 2.str.slice(num)擷取從num開始到結束的字串, str.slice(num1,num2)擷取從num1開始到num2的字串, 3.str.split("&")把字串裡有&截斷。 首先我

(2.1.27.11)Java併發程式設計LockReentrantReadWriteLock 讀寫分離獨享式重入鎖

我們在介紹AbstractQueuedSynchronizer的時候介紹過,AQS支援獨佔式同步狀態獲取/釋放、共享式同步狀態獲取/釋放兩種模式,對應的典型應用分別是ReentrantLock和Semaphore AQS還可以混合兩種模式使用,讀寫鎖Reent

(2.1.27.13)Java併發程式設計LockCountDownLatch計數式獨享鎖

CountDownLatch是一種java.util.concurrent包下一個同步工具類,它允許一個或多個執行緒等待直到在其他執行緒中一組操作執行完成。 相對於前文的鎖,它主要實現了: 呼叫指定次release後,才會釋放鎖 一、使用 public st

(2.1.27.16)Java併發程式設計LockConcurrentHashMap

ConcurrentHashMap 和 HashMap 的底層實現都是 陣列+連結串列或紅黑樹 構成的。 HashMap 的原始碼分析見:Java集合框架——HashMap原始碼分析 ConcurrentHashMap 相比 HashMap 支援多執行緒下的操

java基礎學習JavaWebServlet

其他更多java基礎文章: java基礎學習(目錄) 什麼是Servlet Servlet是一個特殊的Java類, 是執行在 Web 伺服器中的小型 Java 程式(即:伺服器端的小應用程式)。servlet 通常通過 HTTP(超文字傳輸協議)接收和響應來自 Web 客戶端的請求。這個Java類必須

java基礎學習JavaWebEL表示式

其他更多java基礎文章: java基礎學習(目錄) 一、EL表示式 EL 全名為Expression Language。JSP中可以使用EL表示式,EL表示式是用"${}"括起來的指令碼,用來更方便地讀取物件,EL表示式寫在JSP的HTML程式碼中,而不能寫在"<%%>"引起的JSP指令

java基礎學習JavaWebCookie和Session

其他更多java基礎文章: java基礎學習(目錄) 一、會話概述 1.1、什麼是會話? 會話可簡單理解為:使用者開一個瀏覽器,點選多個超連結,訪問伺服器多個web資源,然後關閉瀏覽器,整個過程稱之為一個會話其中不管瀏覽器傳送多少請求,都視為一次會話,直到瀏覽器關閉,本次會話結束。 其中注意,一個瀏

java基礎學習JavaWebJSP

其他更多java基礎文章: java基礎學習(目錄) 本章內容較多,全部認真看完可能需要一小時以上,建議邊看邊做筆記,否則容易混亂 一、JSP概述 1.1、JSP結構 網路伺服器需要一個JSP引擎,也就是一個容器來處理JSP頁面。容器負責截獲對JSP頁面的請求。內嵌JSP容器的Apache支援JS

java基礎學習JavaWebrequest和response

其他更多java基礎文章: java基礎學習(目錄) 學習request和response之前先學習一下http請求 HTTP請求 瀏覽器向伺服器請求某個web資源時,稱之為瀏覽器向伺服器傳送了一個http請求。一個完整http請求應該包含三個部分: 請求行【描述客戶端的請求方式、請求的資源

用bat檔案簡化的python操作

批處理定義:顧名思義,批處理檔案是將一系列命令按一定的順序集合為一個可執行的文字檔案,其副檔名為BAT或者CMD。這些命令統稱批處理命令。小知識:可以在鍵盤上按下Ctrl+C組合鍵來強行終止一個批處理的執行過程。本文不涉及批處理語法,只是提供幾個簡單實用的批處理檔案。 為什麼使用批處理,

JAVA 字串操作

要求: 完成一個java application應用程式,完成字串的各種操作。 操作包括字串的初始化賦值和輸出。 操作包括兩個字串相加合成為一個新字串。 操作包括兩個字串比較其是否相同。

Java 字串操作封裝

java 對常用字串操作的封裝 package com.wiker; import java.beans.XMLDecoder; import java.io.BufferedInputStream; import java.io.ByteArrayInputStre

java入門學習mockito@Mock和@InjectMock

Mockito是java單元測試中,最常用的mck工具之一,提供了諸多打樁方法和註解。其中有兩個比較常用的註解,@Mock和@InjectMock,名字和在程式碼中使用 的位置都很像,對於初學者,很容易誤解。下面花一點時間,做個簡單的介紹。 介紹之前,首先要明確一點:@M

Java 字串 + 操作原理

public class C { String s1 = "a"; String s2 = "a"+"b"; public static void main(String args[]){ } } 在編譯時其,如果+ 操作符兩邊都是常量