\ :將下一字符標記為特殊字符、文本、反向引用或八進制轉(zhuǎn)義符。例如,"n"匹配字符"n"。"\n"匹配換行符。序列"\\"匹配"\","\("匹配"("。
^:匹配輸入字符串開始的位置。如果設(shè)置了?RegExp?對象的?Multiline?屬性,^ 還會與"\n"或"\r"之后的位置匹配。
$:匹配輸入字符串結(jié)尾的位置。如果設(shè)置了?RegExp?對象的?Multiline?屬性,$ 還會與"\n"或"\r"之前的位置匹配。
*:零次或多次匹配前面的字符或子表達式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
+:一次或多次匹配前面的字符或子表達式。例如,"zo+"與"zo"和"zoo"匹配,但與"z"不匹配。+ 等效于 {1,}。
?:零次或一次匹配前面的字符或子表達式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。
{n}:n?是非負整數(shù)。正好匹配?n?次。例如,"o{2}"與"Bob"中的"o"不匹配,但與"food"中的兩個"o"匹配。
{n,}:n?是非負整數(shù)。至少匹配?n?次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。
{n,m}:M?和?n?是非負整數(shù),其中?n?<=?m。匹配至少?n?次,至多?m?次。例如,"o{1,3}"匹配"fooooood"中的頭三個 o。'o{0,1}' 等效于 'o?'。注意:您不能將空格插入逗號和數(shù)字之間。
?:當此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時,匹配模式是"非貪心的"。"非貪心的"模式匹配搜索到的、盡可能短的字符串,而默認的"貪心的"模式匹配搜索到的、盡可能長的字符串。例如,在字符串"oooo"中,"o+?"只匹配單個"o",而"o+"匹配所有"o"。
.:匹配除"\r\n"之外的任何單個字符。若要匹配包括"\r\n"在內(nèi)的任意字符,請使用諸如"[\s\S]"之類的模式。
(pattern):匹配?pattern?并捕獲該匹配的子表達式。可以使用?$0…$9?屬性從結(jié)果"匹配"集合中檢索捕獲的匹配。若要匹配括號字符 ( ),請使用"\("或者"\)"。
(?:pattern):匹配?pattern?但不捕獲該匹配的子表達式,即它是一個非捕獲匹配,不存儲供以后使用的匹配。這對于用"or"字符 (|) 組合模式部件的情況很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更經(jīng)濟的表達式。
(?=pattern):執(zhí)行正向預(yù)測先行搜索的子表達式,該表達式匹配處于匹配?pattern?的字符串的起始點的字符串。它是一個非捕獲匹配,即不能捕獲供以后使用的匹配。如,'Windows(?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。預(yù)測先行不占用字符,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后,而不是在組成預(yù)測先行的字符后。
(?!pattern):執(zhí)行反向預(yù)測先行搜索的子表達式,該表達式匹配不處于匹配?pattern?的字符串的起始點的搜索字符串。它是一個非捕獲匹配,即不能捕獲供以后使用的匹配。如,'Windows(?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。預(yù)測先行不占用字符,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后,而不是在組成預(yù)測先行的字符后。
x|y:匹配?x?或?y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。
[xyz]:字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。
[^xyz]:反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。
[a-z]:字符范圍。匹配指定范圍內(nèi)的任何字符。例如,"[a-z]"匹配"a"到"z"范圍內(nèi)的任何小寫字母。
[^a-z]:反向范圍字符。匹配不在指定的范圍內(nèi)的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范圍內(nèi)的任何字符。
\b:匹配一個字邊界,即字與空格間的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。
\B:非字邊界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。
\cx:匹配?x?指示的控制字符。例如,\cM 匹配 Control-M 或回車符。x?的值必須在 A-Z 或 a-z 之間。如果不是這樣,則假定 c 就是"c"字符本身。
\d:數(shù)字字符匹配。等效于 [0-9]。
\D:非數(shù)字字符匹配。等效于 [^0-9]。
\f:換頁符匹配。等效于 \x0c 和 \cL。
\n:換行符匹配。等效于 \x0a 和 \cJ。
\r:匹配一個回車符。等效于 \x0d 和 \cM。
\s:匹配任何空白字符,包括空格、制表符、換頁符等。與 [?\f\n\r\t\v] 等效。
\S:匹配任何非空白字符。與 [^?\f\n\r\t\v] 等效。
\t:制表符匹配。與 \x09 和 \cI 等效。
\v:垂直制表符匹配。與 \x0b 和 \cK 等效。
\w:匹配任何字類字符,包括下劃線。與"[A-Za-z0-9_]"等效。
\W:與任何非單詞字符匹配。與"[^A-Za-z0-9_]"等效。
\xn:匹配?n,此處的?n?是一個十六進制轉(zhuǎn)義碼。十六進制轉(zhuǎn)義碼必須正好是兩位數(shù)長。例如,"\x41"匹配"A"。"\x041"與"\x04"&"1"等效。允許在正則表達式中使用 ASCII 代碼。
\num:匹配?num,此處的?num?是一個正整數(shù)。到捕獲匹配的反向引用。例如,"(.)\1"匹配兩個連續(xù)的相同字符。
\n:標識一個八進制轉(zhuǎn)義碼或反向引用。如果 \n?前面至少有?n?個捕獲子表達式,那么?n?是反向引用。否則,如果?n?是八進制數(shù) (0-7),那么?n?是八進制轉(zhuǎn)義碼。
\nm:標識一個八進制轉(zhuǎn)義碼或反向引用。如果 \nm?前面至少有?nm?個捕獲子表達式,那么?nm?是反向引用。如果 \nm?前面至少有?n?個捕獲,則?n?是反向引用,后面跟有字符?m。如果兩種前面的情況都不存在,則 \nm?匹配八進制值?nm,其中?n和?m?是八進制數(shù)字 (0-7)。
\nml:當?n?是八進制數(shù) (0-3),m?和?l?是八進制數(shù) (0-7) 時,匹配八進制轉(zhuǎn)義碼?nml。
\un:匹配?n,其中?n?是以四位十六進制數(shù)表示的 Unicode 字符。例如,\u00A9 匹配版權(quán)符號 (?)。
根據(jù) Java Language Specification 的要求,Java 源代碼的字符串中的反斜線被解釋為 Unicode 轉(zhuǎn)義或其他字符轉(zhuǎn)義。因此必須在字符串字面值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 字節(jié)碼編譯器解釋。例如,當解釋為正則表達式時,字符串字面值 "\b" 與單個退格字符匹配,而 "\\b" 與單詞邊界匹配。字符串字面值 "\(hello\)" 是非法的,將導(dǎo)致編譯時錯誤;要與字符串 (hello) 匹配,必須使用字符串字面值 "\\(hello\\)"。
表達式意義:
1.字符
x??? 字符 x。例如a表示字符a
\\??? 反斜線字符。在書寫時要寫為\\\\。(注意:因為java在第一次解析時,把\\\\解析成正則表達式\\,在第二次解析時再解析為\,所以凡是不是1.1列舉到的轉(zhuǎn)義字符,包括1.1的\\,而又帶有\(zhòng)的都要寫兩次)
\0n??? 帶有八進制值 0的字符 n (0 <= n <= 7)
\0nn??? 帶有八進制值 0的字符 nn (0 <= n <= 7)
\0mnn??? 帶有八進制值 0的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh??? 帶有十六進制值 0x的字符 hh
\uhhhh??? 帶有十六進制值 0x的字符 hhhh
\t??? 制表符 ('\u0009')
\n??? 新行(換行)符 ('\u000A')
\r??? 回車符 ('\u000D')
\f??? 換頁符 ('\u000C')
\a??? 報警 (bell) 符 ('\u0007')
\e??? 轉(zhuǎn)義符 ('\u001B')
\cx??? 對應(yīng)于 x 的控制符
2.字符類
[abc]??? a、b或 c(簡單類)。例如[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](減去)
3.預(yù)定義字符類(注意反斜杠要寫兩次,例如\d寫為\\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]
4.POSIX 字符類(僅 US-ASCII)(注意反斜杠要寫兩次,例如\p{Lower}寫為\\p{Lower})
\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]
5.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()
6.Unicode 塊和類別的類
\p{InGreek}??? Greek 塊(簡單塊)中的字符
\p{Lu}??? 大寫字母(簡單類別)
\p{Sc}??? 貨幣符號
\P{InGreek}??? 所有字符,Greek 塊中的除外(否定)
[\p{L}&&[^\p{Lu}]] ??? 所有字母,大寫字母除外(減去)
7.邊界匹配器
^??? 行的開頭,請在正則表達式的開始處使用^。例如:^(abc)表示以abc開頭的字符串。注意編譯的時候要設(shè)置參數(shù)MULTILINE,如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);
$??? 行的結(jié)尾,請在正則表達式的結(jié)束處使用。例如:(^bca).*(abc$)表示以bca開頭以abc結(jié)尾的行。
\b??? 單詞邊界。例如\b(abc)表示單詞的開始或結(jié)束包含有abc,(abcjj、jjabc 都可以匹配)
\B??? 非單詞邊界。例如\B(abc)表示單詞的中間包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)
\A??? 輸入的開頭
\G??? 上一個匹配的結(jié)尾(個人感覺這個參數(shù)沒什么用)。例如\\Gdog表示在上一個匹配結(jié)尾處查找dog如果沒有的話則從開頭查找,注意如果開頭不是dog則不能匹配。
\Z??? 輸入的結(jié)尾,僅用于最后的結(jié)束符(如果有的話)
行結(jié)束符 是一個或兩個字符的序列,標記輸入字符序列的行結(jié)尾。
以下代碼被識別為行結(jié)束符:
‐新行(換行)符 ('\n')、
‐后面緊跟新行符的回車符 ("\r\n")、
‐單獨的回車符 ('\r')、
‐下一行字符 ('\u0085')、
‐行分隔符 ('\u2028') 或
‐段落分隔符 ('\u2029)。
\z??? 輸入的結(jié)尾
當編譯模式時,可以設(shè)置一個或多個標志,例如
Pattern pattern = Pattern.compile(patternString,Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);
下面六個標志都是支持的:
‐CASE_INSENSITIVE:匹配字符時與大小寫無關(guān),該標志默認只考慮US ASCII字符。
‐UNICODE_CASE:當與CASE_INSENSITIVE結(jié)合時,使用Unicode字母匹配
‐MULTILINE:^和$匹配一行的開始和結(jié)尾,而不是整個輸入
‐UNIX_LINES: 當在多行模式下匹配^和$時,只將'\n'看作行終止符
‐DOTALL: 當使用此標志時,.符號匹配包括行終止符在內(nèi)的所有字符
‐CANON_EQ: 考慮Unicode字符的規(guī)范等價
8.Greedy 數(shù)量詞
X???? X,一次或一次也沒有
X*??? X,零次或多次
X+??? X,一次或多次
X{n}??? X,恰好 n 次
X{n,}??? X,至少 n 次
X{n,m}??? X,至少 n 次,但是不超過 m 次
9.Reluctant 數(shù)量詞
X????? X,一次或一次也沒有
X*???? X,零次或多次
X+???? X,一次或多次
X{n}???? X,恰好 n 次
X{n,}???? X,至少 n 次
X{n,m}???? X,至少 n 次,但是不超過 m 次
10.Possessive 數(shù)量詞
X?+??? X,一次或一次也沒有
X*+??? X,零次或多次
X++??? X,一次或多次
X{n}+??? X,恰好 n 次
X{n,}+??? X,至少 n 次
X{n,m}+??? X,至少 n 次,但是不超過 m 次
Greedy,Reluctant,Possessive的區(qū)別在于:(注意僅限于進行.等模糊處理時)
greedy量 詞被看作“貪婪的”,因為它第一次就讀入整個被模糊匹配的字符串。如果第一個匹配嘗試(整個輸入字符串)失敗,匹配器就會在被匹配字符串中的最后一位后退一個字符并且再次嘗試,重復(fù)這個過程,直到找到匹配或者沒有更多剩下的字符可以后退為止。根據(jù)表達式中使用的量詞,它最后試圖匹配的內(nèi)容是1 個或者0個字符。
但是,reluctant量詞采取相反的方式:它們從被匹配字符串的開頭開始,然后逐步地一次讀取一個字符搜索匹配。它們最后試圖匹配的內(nèi)容是整個輸入字符串。
最后,possessive量詞總是讀完整個輸入字符串,嘗試一次(而且只有一次)匹配。和greedy量詞不同,possessive從不后退。
11.Logical 運算符
XY??? X 后跟 Y
X|Y??? X 或 Y
(X)??? X,作為捕獲組。例如(abc)表示把abc作為一個整體進行捕獲
12.Back 引用
\n??? 任何匹配的 nth捕獲組
捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式 ((A)(B(C)))中,存在四個這樣的組:
1??? ??? ((A)(B(C)))
2??? ??? \A
3??? ??? (B(C))
4??? ??? (C)
在表達式中可以通過\n來對相應(yīng)的組進行引用,例如(ab)34\1就表示ab34ab,(ab)34(cd)\1\2就表示ab34cdabcd。
13.引用
\??? Nothing,但是引用以下字符
\Q??? Nothing,但是引用所有字符,直到 \E。QE之間的字符串會原封不動的使用(1.1中轉(zhuǎn)義字符的除外)。例如, ab\\Q{|}\\\\E
可以匹配ab{|}\\
\E??? Nothing,但是結(jié)束從 \Q開始的引用
14.特殊構(gòu)造(非捕獲)
(?:X)??? X,作為非捕獲組
(?idmsux-idmsux) ??? Nothing,但是將匹配標志由 on 轉(zhuǎn)為 off。比如:表達式 (?i)abc(?-i)def 這時,(?i) 打開不區(qū)分大小寫開關(guān),abc 匹配
idmsux說明如下:
‐i CASE_INSENSITIVE :US-ASCII 字符集不區(qū)分大小寫。(?i)
‐d UNIX_LINES : 打開UNIX換行符
‐m MULTILINE :多行模式(?m)
UNIX下?lián)Q行為\n
WINDOWS下?lián)Q行為\r\n(?s)
‐u UNICODE_CASE : Unicode 不區(qū)分大小寫。(?u)
‐x COMMENTS :可以在pattern里面使用注解,忽略pattern里面的whitespace,以及"#"一直到結(jié)尾(#后面為注解)。(?x)例如(?x)abc#asfsdadsa可以匹配字符串a(chǎn)bc
(?idmsux-idmsux:X) ??? X,作為帶有給定標志 on - off 的非捕獲組。與上面的類似,上面的表達式,可以改寫成為:(?i:abc)def,或者 (?i)abc(?-i:def)
(?=X)??? X,通過零寬度的正 lookahead。零寬度正先行斷言,僅當子表達式 X 在 此位置的右側(cè)匹配時才繼續(xù)匹配。例如,\w+(?=\d) 表示字母后面跟數(shù)字,但不捕獲數(shù)字(不回溯)
(?!X)??? X,通過零寬度的負 lookahead。零寬度負先行斷言。僅當子表達式 X 不在 此位置的右側(cè)匹配時才繼續(xù)匹配。例如,\w+(?!\d) 表示字母后面不跟數(shù)字,且不捕獲數(shù)字。
(?<=X)??? X,通過零寬度的正 lookbehind。零寬度正后發(fā)斷言。僅當子表達式 X 在 此位置的左側(cè)匹配時才繼續(xù)匹配。例如,(?<=19)99 表示99前面是數(shù)字19,但不捕獲前面的19。(不回溯)
(??(?>X)??? X,作為獨立的非捕獲組(不回溯)
(?=X)與(?>X)的區(qū)別在于(?>X)是不回溯的。例如被匹配的字符串為abcm
當表達式為a(?:b|bc)m是可以匹配的,而當表達式是a(?>b|bc)時是不能匹配的,因為當后者匹配到b時,由于已經(jīng)匹配,就跳出了非捕獲組,而不再次對組內(nèi)的字符進行匹配。可以加快速度。