正則表達式
1、 正則表達式可以方便的對數據進行匹配,可以執行更加復雜的字符串驗證、拆分、替換功能等。
Eg :現在判斷一個字符串是不是由數字組成?
A :不使用正則表達式
public class RegexDemo01 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str = "1234567890";//此字符串由數字組成 boolean flag = true;//定義標志變量 //不使用正則的基本思路是:將字符串轉換為字符數組,之后再依次進行判斷 char[] c = str.toCharArray();//將字符串轉換為字符數組 for(int i=0;i<c.length;i++){ if(c[i]<'0' || c[i]>'9'){ //如果滿足條件,說明不是由數字組成 flag = false; break; } } if(flag){ System.out.println("yes!由數字組成"); }else{ System.out.println("不是由數字組成!"); } } }
運行結果截圖:
問題:基本思路是將字符串拆分為字符數字之后,一個個進行驗證,如果遇到更加復雜的情況呢?
B : 使用正則表達式
import java.util.regex.Pattern; public class RegexDemo02 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str = "1234567890"; if(Pattern.compile("[0-9]+").matcher(str).matches()){ //使用正則表達式 System.out.println("是由數字組成!"); }else{ System.out.println("不是由數字組成!"); } } }
運行結果截圖:
2、 正則: Pattern 類、 Matcher 類
正則的兩個核心操作類:
A
:
public final class
Matcher
extends
Object
implements
MatchResult
B: public final class
Pattern
extends
Object
implements
Serializable
3、正則表達式的編譯表示形式
指定為字符串的正則表達式必須首先被編譯為此類的實例。然后,可將得到的模式用于創建 Matcher 對象,依照正則表達式,該對象可以與任意 字符序列 匹配。執行匹配所涉及的所有狀態都駐留在匹配器中,所以多個匹配器可以共享同一模式。
因此,典型的調用順序是
Pattern p = Pattern. compile ("a*b");
Matcher m = p. matcher ("aaaaab");
boolean b = m. matches ();
在僅使用一次正則表達式時,可以方便地通過此類定義 matches 方法。此方法編譯表達式并在單個調用中將輸入序列與其匹配。語句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三個語句,盡管對于重復的匹配而言它效率不高,因為它不允許重用已編譯的模式。
此類的實例是不可變的,可供多個并發線程安全使用。 Matcher 類的實例用于此目的則不安全。
1、 常用的正則規則:
構造 |
匹配 |
|
|
字符 |
|
x |
字符 x |
\\ |
反斜線字符 |
\0 n |
帶有八進制值 0 的字符 n (0<= n <=7) |
\0 nn |
帶有八進制值 0 的字符 nn (0<= n <=7) |
\0 mnn |
帶有八進制值 0 的字符 mnn (0<= m <=3、0<= n <=7) |
\x hh |
帶有十六進制值0x 的字符 hh |
\u hhhh |
帶有十六進制值0x 的字符 hhhh |
\t |
制表符 ('\u0009') |
\n |
新行(換行)符 ('\u000A') |
\r |
回車符 ('\u000D') |
\f |
換頁符 ('\u000C') |
\a |
報警 (bell) 符 ('\u0007') |
\e |
轉義符 ('\u001B') |
\c x |
對應于 x 的控制符 |
|
|
字符類 |
|
[abc] |
a、b 或 c(簡單類) |
[^abc] |
任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] |
a 到 z 或 A 到 Z,兩頭的字母包括在內(范圍) |
[a-d[m-p]] |
a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] |
d、e 或 f(交集) |
[a-z&&[^bc]] |
a 到 z,除了 b 和 c:[ad-z](減去) |
[a-z&&[^m-p]] |
a 到 z,而非 m 到 p:[a-lq-z](減去) |
|
|
預定義字符類 |
|
. |
任何字符(與 行結束符 可能匹配也可能不匹配) |
\d |
數字:[0-9] |
\D |
非數字: [^0-9] |
\s |
空白字符:[ \t\n\x0B\f\r] |
\S |
非空白字符:[^\s] |
\w |
單詞字符:[a-zA-Z_0-9] |
\W |
非單詞字符:[^\w] |
|
|
POSIX 字符類(僅 US-ASCII) |
|
\p{Lower} |
小寫字母字符:[a-z] |
\p{Upper} |
大寫字母字符:[A-Z] |
\p{ASCII} |
所有 ASCII:[\x00-\x7F] |
\p{Alpha} |
字母字符:[\p{Lower}\p{Upper}] |
\p{Digit} |
十進制數字:[0-9] |
\p{Alnum} |
字母數字字符:[\p{Alpha}\p{Digit}] |
\p{Punct} |
標點符號:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
\p{Graph} |
可見字符:[\p{Alnum}\p{Punct}] |
\p{Print} |
可打印字符:[\p{Graph}\x20] |
\p{Blank} |
空格或制表符:[ \t] |
\p{Cntrl} |
控制字符:[\x00-\x1F\x7F] |
\p{XDigit} |
十六進制數字:[0-9a-fA-F] |
\p{Space} |
空白字符:[ \t\n\x0B\f\r] |
|
|
java.lang.Character 類(簡單的 java 字符類型 ) |
|
\p{javaLowerCase} |
等效于 java.lang.Character.isLowerCase() |
\p{javaUpperCase} |
等效于 java.lang.Character.isUpperCase() |
\p{javaWhitespace} |
等效于 java.lang.Character.isWhitespace() |
\p{javaMirrored} |
等效于 java.lang.Character.isMirrored() |
|
|
Unicode 塊和類別的類 |
|
\p{InGreek} |
Greek塊(簡單 塊 )中的字符 |
\p{Lu} |
大寫字母(簡單 類別 ) |
\p{Sc} |
貨幣符號 |
\P{InGreek} |
所有字符,Greek 塊中的除外(否定) |
[\p{L}&&[^\p{Lu}]] |
所有字母,大寫字母除外(減去) |
|
|
邊界匹配器 |
|
^ |
行的開頭 |
$ |
行的結尾 |
\b |
單詞邊界 |
\B |
非單詞邊界 |
\A |
輸入的開頭 |
\G |
上一個匹配的結尾 |
\Z |
輸入的結尾,僅用于最后的 結束符 (如果有的話) |
\z |
輸入的結尾 |
|
|
Greedy 數量詞 |
|
X ? |
X ,一次或一次也沒有 |
X * |
X ,零次或多次 |
X + |
X ,一次或多次 |
X { n } |
X ,恰好 n 次 |
X { n ,} |
X ,至少 n 次 |
X { n , m } |
X ,至少 n 次,但是不超過 m 次 |
|
|
Reluctant 數量詞 |
|
X ?? |
X ,一次或一次也沒有 |
X *? |
X ,零次或多次 |
X +? |
X ,一次或多次 |
X { n }? |
X ,恰好 n 次 |
X { n ,}? |
X ,至少 n 次 |
X { n , m }? |
X ,至少 n 次,但是不超過 m 次 |
|
|
Possessive 數量詞 |
|
X ?+ |
X ,一次或一次也沒有 |
X *+ |
X ,零次或多次 |
X ++ |
X ,一次或多次 |
X { n }+ |
X ,恰好 n 次 |
X { n ,}+ |
X ,至少 n 次 |
X { n , m }+ |
X ,至少 n 次,但是不超過 m 次 |
|
|
Logical 運算符 |
|
XY |
X 后跟 Y |
X | Y |
X 或 Y |
( X ) |
X,作為 捕獲組 |
|
|
Back 引用 |
|
\ n |
任何匹配的 n th 捕獲組 |
|
|
引用 |
|
\ |
Nothing,但是引用以下字符 |
\Q |
Nothing,但是引用所有字符,直到 \E |
\E |
Nothing,但是結束從 \Q 開始的引用 |
|
|
特殊構造(非捕獲) |
|
(?: X ) |
X ,作為非捕獲組 |
(?idmsux-idmsux) |
|
(?idmsux-idmsux: X ) |
|
(?= X ) |
X ,通過零寬度的正 lookahead |
(?! X ) |
X ,通過零寬度的負 lookahead |
(?<= X ) |
X ,通過零寬度的正 lookbehind |
(?<! X ) |
X ,通過零寬度的負 lookbehind |
(?> X ) |
X ,作為獨立的非捕獲組 |
4、字符類
字符類可以出現在其他字符類中,并且可以包含并集運算符(隱式)和交集運算符 (&&)。并集運算符表示至少包含其某個操作數類中所有字符的類。交集運算符表示包含同時位于其兩個操作數類中所有字符的類。
字符類運算符的優先級如下所示,按從最高到最低的順序排列:
1 |
字面值轉義 |
\x |
2 |
分組 |
[...] |
3 |
范圍 |
a-z |
4 |
并集 |
[a-e][i-u] |
5 |
交集 |
[a-z&&[aeiou]] |
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
