public final class Patternextends Objectimplements Serializable
正則表達式的編譯表示形式。 html
指定爲字符串的正則表達式必須首先被編譯爲此類的實例。而後,可將獲得的模式用於建立 Matcher 對象,依照正則表達式,該對象能夠與任意字符序列匹配。執行匹配所涉及的全部狀態都駐留在匹配器中,因此多個匹配器能夠共享同一模式。 java
所以,典型的調用順序是 git
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
在僅使用一次正則表達式時,能夠方便地經過此類定義 matches 方法。此方法編譯表達式並在單個調用中將輸入序列與其匹配。語句 正則表達式
等效於上面的三個語句,儘管對於重複的匹配而言它效率不高,由於它不容許重用已編譯的模式。boolean b = Pattern.matches("a*b", "aaaaab");
此類的實例是不可變的,可供多個併發線程安全使用。Matcher 類的實例用於此目的則不安全。 安全
構造 | 匹配 |
---|---|
字符 | |
x | 字符 x |
\\ | 反斜線字符 |
\0n | 帶有八進制值0的字符 n (0 <= n <= 7) |
\0nn | 帶有八進制值0的字符 nn (0 <= n <= 7) |
\0mnn | 帶有八進制值0的字符 mnn(0 <= m <= 三、0 <= n <= 7) |
\xhh | 帶有十六進制值 0x的字符 hh |
\uhhhh | 帶有十六進制值 0x的字符 hhhh |
\t | 製表符 ('\u0009') |
\n | 新行(換行)符 ('\u000A') |
\r | 回車符 ('\u000D') |
\f | 換頁符 ('\u000C') |
\a | 報警 (bell) 符 ('\u0007') |
\e | 轉義符 ('\u001B') |
\cx | 對應於 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 | 任何匹配的 nth 捕獲組 |
引用 | |
\ | Nothing,可是引用如下字符 |
\Q | Nothing,可是引用全部字符,直到\E |
\E | Nothing,可是結束從\Q開始的引用 |
特殊構造(非捕獲) | |
(?:X) | X,做爲非捕獲組 |
(?idmsux-idmsux) | Nothing,可是將匹配標誌i d m s u x on - off |
(?idmsux-idmsux:X) | X,做爲帶有給定標誌 i d m s u x on - off |
(?=X) | X,經過零寬度的正 lookahead |
(?!X) | X,經過零寬度的負 lookahead |
(?<=X) | X,經過零寬度的正 lookbehind |
(?<!X) | X,經過零寬度的負 lookbehind |
(?>X) | X,做爲獨立的非捕獲組 |
反斜線字符 ('\') 用於引用轉義構造,如上表所定義的,同時還用於引用其餘將被解釋爲非轉義構造的字符。所以,表達式\\與單個反斜線匹配,而\{與左括號匹配。 併發
在不表示轉義構造的任何字母字符前使用反斜線都是錯誤的;它們是爲未來擴展正則表達式語言保留的。能夠在非字母字符前使用反斜線,無論該字符是否非轉義構造的一部分。 spa
根據 Java Language Specification 的要求,Java 源代碼的字符串中的反斜線被解釋爲 Unicode 轉義或其餘字符轉義。所以必須在字符串字面值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 字節碼編譯器解釋。例如,當解釋爲正則表達式時,字符串字面值"\b"與單個退格字符匹配,而"\\b"與單詞邊界匹配。字符串字面值"\(hello\)"是非法的,將致使編譯時錯誤;要與字符串(hello)匹配,必須使用字符串字面值"\\(hello\\)"。 .net
字符類能夠出如今其餘字符類中,而且能夠包含並集運算符(隱式)和交集運算符 (&&)。並集運算符表示至少包含其某個操做數類中全部字符的類。交集運算符表示包含同時位於其兩個操做數類中全部字符的類。 線程
字符類運算符的優先級以下所示,按從最高到最低的順序排列: code
1 字面值轉義 \x 2 分組 [...] 3 範圍 a-z 4 並集 [a-e][i-u] 5 交集 [a-z&&[aeiou]]
注意,元字符的不一樣集合實際上位於字符類的內部,而非字符類的外部。例如,正則表達式.在字符類內部就失去了其特殊意義,而表達式-變成了造成元字符的範圍。
附 : 經常使用的正則表達式:
匹配特定數字: ^[1-9]d*$ //匹配正整數 ^-[1-9]d*$ //匹配負整數 ^-?[1-9]d*$ //匹配整數 ^[1-9]d*|0$ //匹配非負整數(正整數 + 0) ^-[1-9]d*|0$ //匹配非正整數(負整數 + 0) ^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮點數 ^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配負浮點數 ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮點數 ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非負浮點數(正浮點數 + 0) ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮點數(負浮點數 + 0) 評註:處理大量數據時有用,具體應用時注意修正 匹配特定字符串: ^[A-Za-z]+$ //匹配由26個英文字母組成的字符串 ^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串 ^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串 ^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串 ^w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串 在使用RegularExpressionValidator驗證控件時的驗證功能及其驗證表達式介紹以下: 只能輸入數字:「^[0-9]*$」 只能輸入n位的數字:「^d{n}$」 只能輸入至少n位數字:「^d{n,}$」 只能輸入m-n位的數字:「^d{m,n}$」 只能輸入零和非零開頭的數字:「^(0|[1-9][0-9]*)$」 只能輸入有兩位小數的正實數:「^[0-9]+(.[0-9]{2})?$」 只能輸入有1-3位小數的正實數:「^[0-9]+(.[0-9]{1,3})?$」 只能輸入非零的正整數:「^+?[1-9][0-9]*$」 只能輸入非零的負整數:「^-[1-9][0-9]*$」 只能輸入長度爲3的字符:「^.{3}$」 只能輸入由26個英文字母組成的字符串:「^[A-Za-z]+$」 只能輸入由26個大寫英文字母組成的字符串:「^[A-Z]+$」 只能輸入由26個小寫英文字母組成的字符串:「^[a-z]+$」 只能輸入由數字和26個英文字母組成的字符串:「^[A-Za-z0-9]+$」 只能輸入由數字、26個英文字母或者下劃線組成的字符串:「^w+$」 驗證用戶密碼:「^[a-zA-Z]w{5,17}$」正確格式爲:以字母開頭,長度在6-18之間, 只能包含字符、數字和下劃線。 驗證是否含有^%&’,;=?$」等字符:「[^%&’,;=?$x22]+」 只能輸入漢字:「^[u4e00-u9fa5],{0,}$」 驗證Email地址:「^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$」 驗證InternetURL:「^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$」 驗證電話號碼:「^((d{3,4})|d{3,4}-)?d{7,8}$」 正確格式爲:「XXXX-XXXXXXX」,「XXXX-XXXXXXXX」,「XXX-XXXXXXX」, 「XXX-XXXXXXXX」,「XXXXXXX」,「XXXXXXXX」。 驗證身份證號(15位或18位數字):「^d{15}|d{}18$」 驗證一年的12個月:「^(0?[1-9]|1[0-2])$」正確格式爲:「01」-「09」和「1」「12」 驗證一個月的31天:「^((0?[1-9])|((1|2)[0-9])|30|31)$」 正確格式爲:「01」「09」和「1」「31」。 匹配中文字符的正則表達式: [u4e00-u9fa5] 匹配雙字節字符(包括漢字在內):[^x00-xff] 匹配空行的正則表達式:n[s| ]*r 匹配HTML標記的正則表達式:/< (.*)>.*|< (.*) />/ 匹配首尾空格的正則表達式:(^s*)|(s*$) 匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 匹配網址URL的正則表達式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?