Java正則表達(dá)式的解釋說(shuō)明
1.1.字符
x 字符 x。例如a表示字符a
\\ 反斜線(xiàn)字符。在書(shū)寫(xiě)時(shí)要寫(xiě)為\\\\。(注意:因?yàn)閖ava在第一次解析時(shí)把\\\\解析成正則表達(dá)式\\,在第二次解析時(shí)再解析為\,所以凡是不是1.1列舉到的轉(zhuǎn)義字符,包括1.1的\\,而又帶有\(zhòng)的都要寫(xiě)兩次)
\0n 帶有八進(jìn)制值 0的字符 n (0 <= n <= 7)
\0nn 帶有八進(jìn)制值 0的字符 nn (0 <= n <= 7)
\0mnn 帶有八進(jìn)制值 0的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 帶有十六進(jìn)制值 0x的字符 hh
\uhhhh 帶有十六進(jìn)制值 0x的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(換行)符 ('\u000A')
\r 回車(chē)符 ('\u000D')
\f 換頁(yè)符 ('\u000C')
\a 報(bào)警 (bell) 符 ('\u0007')
\e 轉(zhuǎn)義符 ('\u001B')
\cx 對(duì)應(yīng)于 x 的控制符
1.2.字符類(lèi)
[abc] a、b或 c(簡(jiǎn)單類(lèi))。例如[egd]表示包含有字符e、g或d。
[^abc] 任何字符,除了 a、b或 c(否定)。例如[^egd]表示不包含字符e、g或d。
[a-zA-Z] a到 z或 A到 Z,兩頭的字母包括在內(nèi)(范圍)
[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](減去)
1.3.預(yù)定義字符類(lèi)(注意反斜杠要寫(xiě)兩次,例如\d寫(xiě)為\\d)
. 任何字符(與行結(jié)束符可能匹配也可能不匹配)
\d 數(shù)字:[0-9]
\D 非數(shù)字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
1.4.POSIX 字符類(lèi)(僅 US-ASCII)(注意反斜杠要寫(xiě)兩次,例如\p{Lower}寫(xiě)為\\p{Lower})
\p{Lower} 小寫(xiě)字母字符:[a-z]。
\p{Upper} 大寫(xiě)字母字符:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
\p{Digit} 十進(jìn)制數(shù)字:[0-9]
\p{Alnum} 字母數(shù)字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 標(biāo)點(diǎn)符號(hào):!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} 可見(jiàn)字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或制表符:[ \t]
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
\p{XDigit} 十六進(jìn)制數(shù)字:[0-9a-fA-F]
\p{Space} 空白字符:[ \t\n\x0B\f\r]
1.5.java.lang.Character 類(lèi)(簡(jiǎn)單的 java 字符類(lèi)型)
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效于 java.lang.Character.isMirrored()
1.6.Unicode 塊和類(lèi)別的類(lèi)
\p{InGreek} Greek 塊(簡(jiǎn)單塊)中的字符
\p{Lu} 大寫(xiě)字母(簡(jiǎn)單類(lèi)別)
\p{Sc} 貨幣符號(hào)
\P{InGreek} 所有字符,Greek 塊中的除外(否定)
[\p{L}&&[^\p{Lu}]] 所有字母,大寫(xiě)字母除外(減去)
1.7.邊界匹配器
^ 行的開(kāi)頭,請(qǐng)?jiān)谡齽t表達(dá)式的開(kāi)始處使用^。例如:^(abc)表示以abc開(kāi)頭的字符串。注意編譯的時(shí)候要設(shè)置參數(shù)MULTILINE,如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);
$ 行的結(jié)尾,請(qǐng)?jiān)谡齽t表達(dá)式的結(jié)束處使用。例如:(^bca).*(abc$)表示以bca開(kāi)頭以abc結(jié)尾的行。
\b 單詞邊界。例如\b(abc)表示單詞的開(kāi)始或結(jié)束包含有abc,(abcjj、jjabc 都可以匹配)
\B 非單詞邊界。例如\B(abc)表示單詞的中間包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)
\A 輸入的開(kāi)頭
\G 上一個(gè)匹配的結(jié)尾(個(gè)人感覺(jué)這個(gè)參數(shù)沒(méi)什么用)。例如\\Gdog表示在上一個(gè)匹配結(jié)尾處查找dog如果沒(méi)有的話(huà)則從開(kāi)頭查找,注意如果開(kāi)頭不是dog則不能匹配。
\Z 輸入的結(jié)尾,僅用于最后的結(jié)束符(如果有的話(huà))
行結(jié)束符 是一個(gè)或兩個(gè)字符的序列,標(biāo)記輸入字符序列的行結(jié)尾。
以下代碼被識(shí)別為行結(jié)束符:
‐新行(換行)符 ('\n')、
‐后面緊跟新行符的回車(chē)符 ("\r\n")、
‐單獨(dú)的回車(chē)符 ('\r')、
‐下一行字符 ('\u0085')、
‐行分隔符 ('\u2028') 或
‐段落分隔符 ('\u2029)。
\z 輸入的結(jié)尾
當(dāng)編譯模式時(shí),可以設(shè)置一個(gè)或多個(gè)標(biāo)志,例如
Pattern pattern = Pattern.compile(patternString,Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);
下面六個(gè)標(biāo)志都是支持的:
‐CASE_INSENSITIVE:匹配字符時(shí)與大小寫(xiě)無(wú)關(guān),該標(biāo)志默認(rèn)只考慮US ASCII字符。
‐UNICODE_CASE:當(dāng)與CASE_INSENSITIVE結(jié)合時(shí),使用Unicode字母匹配
‐MULTILINE:^和$匹配一行的開(kāi)始和結(jié)尾,而不是整個(gè)輸入
‐UNIX_LINES: 當(dāng)在多行模式下匹配^和$時(shí),只將'\n'看作行終止符
‐DOTALL: 當(dāng)使用此標(biāo)志時(shí),.符號(hào)匹配包括行終止符在內(nèi)的所有字符
‐CANON_EQ: 考慮Unicode字符的規(guī)范等價(jià)
1.8.Greedy 數(shù)量詞
X? X,一次或一次也沒(méi)有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過(guò) m 次
1.9.Reluctant 數(shù)量詞
X?? X,一次或一次也沒(méi)有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超過(guò) m 次
1.10.Possessive 數(shù)量詞
X?+ X,一次或一次也沒(méi)有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超過(guò) m 次
Greedy,Reluctant,Possessive的區(qū)別在于:(注意僅限于進(jìn)行.等模糊處理時(shí))
greedy量 詞被看作“貪婪的”,因?yàn)樗谝淮尉妥x入整個(gè)被模糊匹配的字符串。如果第一個(gè)匹配嘗試(整個(gè)輸入字符串)失敗,匹配器就會(huì)在被匹配字符串中的最后一位后退一個(gè)字符并且再次嘗試,重復(fù)這個(gè)過(guò)程,直到找到匹配或者沒(méi)有更多剩下的字符可以后退為止。根據(jù)表達(dá)式中使用的量詞,它最后試圖匹配的內(nèi)容是1 個(gè)或者0個(gè)字符。
但是,reluctant量詞采取相反的方式:它們從被匹配字符串的開(kāi)頭開(kāi)始,然后逐步地一次讀取一個(gè)字符搜索匹配。它們最后試圖匹配的內(nèi)容是整個(gè)輸入字符串。
最后,possessive量詞總是讀完整個(gè)輸入字符串,嘗試一次(而且只有一次)匹配。和greedy量詞不同,possessive從不后退。
1.11.Logical 運(yùn)算符
XY X 后跟 Y
X|Y X 或 Y
(X) X,作為捕獲組。例如(abc)表示把a(bǔ)bc作為一個(gè)整體進(jìn)行捕獲
1.12.Back 引用
\n 任何匹配的 nth捕獲組
捕獲組可以通過(guò)從左到右計(jì)算其開(kāi)括號(hào)來(lái)編號(hào)。例如,在表達(dá)式 ((A)(B(C)))中,存在四個(gè)這樣的組:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
在表達(dá)式中可以通過(guò)\n來(lái)對(duì)相應(yīng)的組進(jìn)行引用,例如(ab)34\1就表示ab34ab,(ab)34(cd)\1\2就表示ab34cdabcd。
1.13.引用
\ Nothing,但是引用以下字符
\Q Nothing,但是引用所有字符,直到 \E。QE之間的字符串會(huì)原封不動(dòng)的使用(1.1中轉(zhuǎn)義字符的除外)。例如, ab\\Q{|}\\\\E
可以匹配ab{|}\\
\E Nothing,但是結(jié)束從 \Q開(kāi)始的引用
1.14.特殊構(gòu)造(非捕獲)
(?:X) X,作為非捕獲組
(?idmsux-idmsux) Nothing,但是將匹配標(biāo)志由 on 轉(zhuǎn)為 off。比如:表達(dá)式 (?i)abc(?-i)def 這時(shí),(?i) 打開(kāi)不區(qū)分大小寫(xiě)開(kāi)關(guān),abc 匹配
idmsux說(shuō)明如下:
‐i CASE_INSENSITIVE :US-ASCII 字符集不區(qū)分大小寫(xiě)。(?i)
‐d UNIX_LINES : 打開(kāi)UNIX換行符
‐m MULTILINE :多行模式(?m)
UNIX下?lián)Q行為\n
WINDOWS下?lián)Q行為\r\n(?s)
‐u UNICODE_CASE : Unicode 不區(qū)分大小寫(xiě)。(?u)
‐x COMMENTS :可以在pattern里面使用注解,忽略pattern里面的whitespace,以及"#"一直到結(jié)尾(#后面為注解)。(?x)例如(?x)abc#asfsdadsa可以匹配字符串a(chǎn)bc
(?idmsux-idmsux:X) X,作為帶有給定標(biāo)志 on - off 的非捕獲組。與上面的類(lèi)似,上面的表達(dá)式,可以改寫(xiě)成為:(?i:abc)def,或者 (?i)abc(?-i:def)
(?=X) X,通過(guò)零寬度的正 lookahead。零寬度正先行斷言,僅當(dāng)子表達(dá)式 X 在 此位置的右側(cè)匹配時(shí)才繼續(xù)匹配。例如,\w+(?=\d) 表示字母后面跟數(shù)字,但不捕獲數(shù)字(不回溯)
(?!X) X,通過(guò)零寬度的負(fù) lookahead。零寬度負(fù)先行斷言。僅當(dāng)子表達(dá)式 X 不在 此位置的右側(cè)匹配時(shí)才繼續(xù)匹配。例如,\w+(?!\d) 表示字母后面不跟數(shù)字,且不捕獲數(shù)字。
(?<=X) X,通過(guò)零寬度的正 lookbehind。零寬度正后發(fā)斷言。僅當(dāng)子表達(dá)式 X 在 此位置的左側(cè)匹配時(shí)才繼續(xù)匹配。例如,(?<=19)99 表示99前面是數(shù)字19,但不捕獲前面的19。(不回溯)
(?<!X) X,通過(guò)零寬度的負(fù) lookbehind。零寬度負(fù)后發(fā)斷言。僅當(dāng)子表達(dá)式 X 不在此位置的左側(cè)匹配時(shí)才繼續(xù)匹配。例如,(?<!19)99 表示99前面不能是19,且不捕獲前面的東東。
(?>X) X,作為獨(dú)立的非捕獲組(不回溯)
(?=X)與(?>X)的區(qū)別在于(?>X)是不回溯的。例如被匹配的字符串為abcm
當(dāng)表達(dá)式為a(?:b|bc)m是可以匹配的,而當(dāng)表達(dá)式是a(?>b|bc)時(shí)是不能匹配的,因?yàn)楫?dāng)后者匹配到b時(shí),由于已經(jīng)匹配,就跳出了非捕獲組,而不再次對(duì)組內(nèi)的字符進(jìn)行匹配??梢约涌焖俣?。
【編輯推薦】
- Java正則表達(dá)式工具類(lèi)實(shí)例
- Zend為Java提供的PHP解決方案
- JAVA 正則表達(dá)式4種常用的功能
- Java正則表達(dá)式之group()
- Java 14年的變化
【責(zé)任編輯:慧增 TEL:(010)68476606】