Java使用正則表示式檢索、替換String中特定字元和正則表示式的一切
引言
String這個對於程式原來說一定是最熟悉不過的,很多時候我們都習慣去使用String的原生方法去完成查詢字串、替換、刪除,而正則表示式由於略顯苦澀的語法常常被人忽略,其實很多時候使用正則表示式可以提高不少效能和節省資源。
一、正則表示式簡述
正則表示式正則表達是Java中比較矛盾的知識點,因為使用起來可以很簡單也可以相當地有難度,但是對於字串操作來說應用得當則事半功倍,字串查詢,搜尋,匹配,替換等等,正則表示式無所不能。而所謂正則表示式本質就是一個字串(這個字串按照一定的語法和規範被構造出來作為限定條件),其主要參與者——Pattern和Matcher:Pattern是Java正則表示式API中的主要入口,是程式語言中對這個特殊正則字串的編譯表示,需要使用正則表示式,第一步都是從構造Pattern 類開始,而Matcher是輸入字串進行解釋和匹配操作的引擎,通過解釋 Pattern 對 Character sequence 執行匹配操作(即Matcher負責完成字串的查詢、匹配、替換等操作。)
二、正則表示式基本語法
1、預留字元
限定符 | 說明 |
---|---|
. | 任意英文字母比如a-z,表示從a到z |
? | 當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。 |
\ | 反斜槓,單獨的反斜槓做為轉義字元,與其他特殊字元一起使用。如果想匹配反斜槓本身,需要轉義。兩個反斜槓實際匹配一個反斜槓n字元的8進製表示.n 在0至7之間取值 |
nn | 字元的8進製表示.n 在0至7之間取值 |
mnn | 字元的8進製表示. m 在0至3之間取值,n 在0至7之間取值 |
\xhh | 字元的16進製表示. |
\uhhhh | 字元的16進製表示 0xhhhh. 對應unicode 編碼字元 |
\t | 縮排符. |
\n | 換行符 (unicode: ‘\u000A') |
\r | 回車符 (unicode: ‘\u000D') |
\f | 製表符 (unicode: ‘\u000C') |
\a | 警報(鈴聲)字元 (unicode: ‘\u0007′) |
\e | 轉義符 (unicode: ‘\u001B') |
\cx | 控制符 x |
\d | 匹配任意數字 [0-9] |
\D | 匹配任意非數字 [^0-9] |
\s | 匹配任意空白符 (空格,縮排,換行,回車) |
\S | 匹配任意非空白符 |
\w | 匹配任意單詞 |
\W | 匹配任意非單詞 |
2、設定指定限定條件**[]**(即“[]”表示的是中括符裡的內容是條件)
限定符 | 說明 |
---|---|
[a-z] | 匹配小寫a to z範圍中任一個字元,又如[abc] 匹配 a,或 b 或 c |
[A-Z] | 匹配大寫A to Z範圍中任一個字元 |
[a-zA-Z] | 匹配小寫a to z或大寫A to Z範圍中一個字元 |
[0-9] | 匹配小寫0 to 9範圍中一個字元 |
[0-9a-z] | 匹配小寫0 to 9或a to z範圍中一個字元 |
[0-9[a-z]] | 匹配小寫0 to 9或a to z範圍中一個字元(交集) |
[^abc] | 匹配不是a,b,c 的字元,是否定匹配 |
[a-zA-Z] | 匹配a 到 z ,A到Z 直接的字元,是範圍匹配 |
[a-d[m-p]] | 匹配a到d之間字元或 m到p之間字元,是並集匹配 |
[a-z&&[def]] | 匹配 d,e,或 f. 是交集匹配 (這裡是在範圍 a-z和字元def之間取交集). |
[a-z&&[^bc]] | 匹配a-z 之間所有字元,排除bc的字元。是減法匹配 |
[a-z&&[^m-p]] | 匹配a-z 之間所有字元,排除m-p之間的字元是減法匹配 |
3、邊界匹配
邊界符 | 說明 |
---|---|
^ | 匹配行首 |
$ | 匹配行尾 |
\b | 匹配單詞邊界 |
\B | 匹配非單詞邊界 |
\A | 匹配文字開頭 |
\G | 匹配前一匹配項結尾 |
\Z | 輸入的結尾,僅用於最後的結束符(如果有的話) |
\z | 匹配文字結尾 |
4、邏輯操作符和量詞表示
正則表示式支援少量的邏輯運算(與,或)。與操作是預設的,表示式 cmo,意味著c 與 m與o。
或操作需要顯示指定,用 | 表示。例如表示式 crazy|mo意味著crazy或 mo。
貪婪模式 | 飢餓模式 | 獨佔模式 | :說明: |
---|---|---|---|
X? | X?? | X?+ | 匹配0或1次,即出現X 0或者1次 |
X* | X**? | X*+ | 匹配0或多次 |
X+ | X+? | X++ | 匹配1或多次 |
X{n} | X{n}? | X{n}+ | 匹配n次 |
X{n,} | X{n,}? | X{n,}+ | 匹配最少n次 |
X{n,m} | X{n,m}? | X{n,m}+ | 匹配最少n次,最多m次 |
可參考表示式全集
三、正則表示式的應用
編譯正則表示式的字串值構造對應的模式Pattern物件
建立匹配給定輸入與此模式的匹配器Matcher
通過匹配器物件執行操作,匹配器物件的方法很豐富,互相組合使用更加強大(JDK線上API)
1、去掉字串中的空格和換行符
public static String getNonBlankStr(String str) { if(str!=null && !"".equals(str)) { Pattern pattern = Pattern.compile("\\s*|\t|\r|\n"); //去掉空格符合換行符 Matcher matcher = pattern.matcher(str); String result = matcher.replaceAll(""); return result; }else { return str; } }
2、去掉指定特殊字元
public static String StringFilter(String str) throws PatternSyntaxException { // String regEx = "[^a-zA-Z0-9]"; // 只允許字母和數字 // 清除掉所有特殊字元(除了~之外) String regEx="[`!@#$%^&*()+=|{}':;',//[//].<>/?!@#¥%……&*()——+|{}【】‘;:”“'。,、?]"; Pattern pattern = Pattern.compile(regEx); Matcher matcher = pattern.matcher(str); return matcher.replaceAll("").trim(); }
3、Pattern.matches()檢查字串中是否存在指定字元
public static String StringFilter(String str) throws PatternSyntaxException { // String regEx = "[^a-zA-Z0-9]"; // 只允許字母和數字 // 清除掉所有特殊字元(除了~之外) String regEx="[`!@#$%^&*()+=|{}':;',//[//].<>/?!@#¥%……&*()——+|{}【】‘;:”“'。,、?]"; Pattern pattern = Pattern.compile(regEx); Matcher matcher = pattern.matcher(str); return matcher.replaceAll("").trim(); }
4、Pattern.split()用正則表示式作為分隔符,把文字分割為String型別的陣列
/** * 結果:element = grjk Text element = wwwdsf element = Many element = egsdg r geg */ String text = "A reg grjk Text reg wwwdsf reg Many reg egsdg r geg"; String patternString = "reg"; Pattern pattern = Pattern.compile(patternString); String[] split = pattern.split(text); for(String element : split){ System.out.println("element = " + element); }
5、Matcher 例項的find() + start() + end()尋找字串中指定字串出現的次數和起始和結束的索引位置
/** *結果:found: 1 : 2 - 4 found: 2 : 5 - 7 found: 3 : 23 - 25 found: 4 : 70 - 72 */ String text ="This is the text which is to be searched " +"for occurrences of the word 'is'."; String patternString = "is"; Pattern pattern = Pattern.compile(patternString); Matcher matcher = pattern.matcher(text); int count = 0; while(matcher.find()) { count++; System.out.println("found: " + count + " : " + matcher.start() + " - " + matcher.end()); }
6、Matcher 匹配指定格式的特殊字串
Pattern pattern = Pattern.compile("[0-9]*");//判斷是否都是數字 Matcher isNum = pattern.matcher("1123是數字"); if(isNum.matches()) { System.out.println("全部是數字"); } else { System.out.println("有漢字"); } //匹配任意字串中包含形如“@數字&”格式的子串 String st="看,牆面上的雕塑是什麼?@322&大家一定猜到了,這是一個神經元。匯區的研院校及企業資源,促進產學研醫多個環節上的相互合作與交融"; Pattern pattern = Pattern.compile("^(.*)@-?[1-9]\\d*&(.*)$"); //去掉空格符合換行符 Matcher matcher = pattern.matcher(st); boolean result = matcher.find();
待續…
總結
到此這篇關於Java使用正則表示式檢索、替換String中特定字元和正則表示式的一切的文章就介紹到這了,更多相關Java正則表示式檢索、替換String特定字元內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!