正則表達式
1、 正則表達式可以方便的對數(shù)據(jù)進行匹配,可以執(zhí)行更加復雜的字符串驗證、拆分、替換功能等。
Eg :現(xiàn)在判斷一個字符串是不是由數(shù)字組成?
A :不使用正則表達式
public class RegexDemo01 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "1234567890";//此字符串由數(shù)字組成
boolean flag = true;//定義標志變量
//不使用正則的基本思路是:將字符串轉換為字符數(shù)組,之后再依次進行判斷
char[] c = str.toCharArray();//將字符串轉換為字符數(shù)組
for(int i=0;i<c.length;i++){
if(c[i]<'0' || c[i]>'9'){ //如果滿足條件,說明不是由數(shù)字組成
flag = false;
break;
}
}
if(flag){
System.out.println("yes!由數(shù)字組成");
}else{
System.out.println("不是由數(shù)字組成!");
}
}
}
運行結果截圖:
問題:基本思路是將字符串拆分為字符數(shù)字之后,一個個進行驗證,如果遇到更加復雜的情況呢?
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("是由數(shù)字組成!");
}else{
System.out.println("不是由數(shù)字組成!");
}
}
}
運行結果截圖:
2、 正則: Pattern 類、 Matcher 類
正則的兩個核心操作類:
A
:
public final class
Matcher
extends
Object
implements
MatchResult
B: public final class
Pattern
extends
Object
implements
Serializable
3、正則表達式的編譯表示形式
指定為字符串的正則表達式必須首先被編譯為此類的實例。然后,可將得到的模式用于創(chuàng)建 Matcher 對象,依照正則表達式,該對象可以與任意 字符序列 匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中,所以多個匹配器可以共享同一模式。
因此,典型的調用順序是
Pattern p = Pattern. compile ("a*b");
Matcher m = p. matcher ("aaaaab");
boolean b = m. matches ();
在僅使用一次正則表達式時,可以方便地通過此類定義 matches 方法。此方法編譯表達式并在單個調用中將輸入序列與其匹配。語句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三個語句,盡管對于重復的匹配而言它效率不高,因為它不允許重用已編譯的模式。
此類的實例是不可變的,可供多個并發(fā)線程安全使用。 Matcher 類的實例用于此目的則不安全。
1、 常用的正則規(guī)則:
|
構造 |
匹配 |
|
|
|
|
字符 |
|
|
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 |
數(shù)字:[0-9] |
|
\D |
非數(shù)字: [^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} |
十進制數(shù)字:[0-9] |
|
\p{Alnum} |
字母數(shù)字字符:[\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} |
十六進制數(shù)字:[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 數(shù)量詞 |
|
|
X ? |
X ,一次或一次也沒有 |
|
X * |
X ,零次或多次 |
|
X + |
X ,一次或多次 |
|
X { n } |
X ,恰好 n 次 |
|
X { n ,} |
X ,至少 n 次 |
|
X { n , m } |
X ,至少 n 次,但是不超過 m 次 |
|
|
|
|
Reluctant 數(shù)量詞 |
|
|
X ?? |
X ,一次或一次也沒有 |
|
X *? |
X ,零次或多次 |
|
X +? |
X ,一次或多次 |
|
X { n }? |
X ,恰好 n 次 |
|
X { n ,}? |
X ,至少 n 次 |
|
X { n , m }? |
X ,至少 n 次,但是不超過 m 次 |
|
|
|
|
Possessive 數(shù)量詞 |
|
|
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、字符類
字符類可以出現(xiàn)在其他字符類中,并且可以包含并集運算符(隱式)和交集運算符 (&&)。并集運算符表示至少包含其某個操作數(shù)類中所有字符的類。交集運算符表示包含同時位于其兩個操作數(shù)類中所有字符的類。
字符類運算符的優(yōu)先級如下所示,按從最高到最低的順序排列:
|
1 |
字面值轉義 |
\x |
|
2 |
分組 |
[...] |
|
3 |
范圍 |
a-z |
|
4 |
并集 |
[a-e][i-u] |
|
5 |
交集 |
[a-z&&[aeiou]] |
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

