小知識(shí):{} 定義了一個(gè)范圍 [] 定義了一個(gè)字符類 () 定義了一個(gè)組
*前面出現(xiàn)0次以上 + 前面匹配一次以上 ?前面出現(xiàn)0次或一次
1).字符:
x------字符x
""-----反斜杠
"0n----十進(jìn)制數(shù) (0 <= n <= 7)
"0nn---十進(jìn)制數(shù)0nn (0 <= n <= 7)
"0mnn--十進(jìn)制數(shù)0mnn (0 <= m <= 3,0 <= n <= 7)
"xhh---十六進(jìn)制數(shù) 0xhh
""uhhh-十六進(jìn)制數(shù) 0uhhh
"t-----制表符 ('"u0009') 2)
"n-----換行符 ('"u000A')
"r----- 回車符 ('"u000D')
"e----- esc符號(hào) ('"u001B')
"cx---- x 對(duì)應(yīng)的控制符
2).字符類:
[abc] a, b, 或 c (簡(jiǎn)單字符串)
[^abc] 除了 a, b, 或 c 之外的任意字符(否定)
[a-zA-Z] 從a 到 z 或 從A 到 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](子集)
3).預(yù)定義字符序列 :
. 任意字符 (也可能不包括行結(jié)束符)
"d 數(shù)字: [0-9]
"D 非數(shù)字: [^0-9]
"s 空字符: [ "t"n"x0B"f"r](A whitespace character)
"S 非空字符: [^"s]
"w 單字字符: [a-zA-Z_0-9]
"W 非單字字符: [^"w]
4).POSIX 字符類 (US-ASCII only) :
"p{Lower} 小寫(xiě)字母字符: [a-z]
"p{Upper} 大寫(xiě)字母字符:[A-Z]
"p{ASCII} 所有 ASCII:["x00-"x7F]
"p{Alpha} 單個(gè)字母字符:["p{Lower}"p{Upper}]
"p{Digit} 十進(jìn)制數(shù): [0-9]
"p{Alnum} 單個(gè)字符:["p{Alpha}"p{Digit}]
"p{Punct} 標(biāo)點(diǎn)符號(hào): 包括 !"#$%&'()*+,-./:;<=>?@["]^_`{|}~
"p{Graph} 可視字符: ["p{Alnum}"p{Punct}]
"p{Print} 可打印字符: ["p{Graph}]
"p{Blank} 空格或制表符: [ "t]
"p{Cntrl} 控制字符: ["x00-"x1F"x7F]
"p{XDigit} 十六進(jìn)制數(shù): [0-9a-fA-F]
"p{Space} 空字符: [ "t"n"x0B"f"r]
5). Unicode 字符類:
"p{InGreek} 希臘語(yǔ)種的字符 (simple block)
"p{Lu} 大寫(xiě)字母 (simple category)
"p{Sc} 貨幣符號(hào)
"P{InGreek} 除希臘語(yǔ)種字符外的任意字符 (negation)
["p{L}&&[^"p{Lu}]] 除大寫(xiě)字母外的任意字符 (subtraction)
6). 邊界匹配器:
^ 一行的開(kāi)始
$ 一行的結(jié)束
"b 單詞邊界
"B 非單詞邊界
"A 輸入的開(kāi)始
"G 當(dāng)前匹配的結(jié)束
"Z The end of the input but for the final terminator, if any
"z 輸入的結(jié)束
6).Greedy quantifiers 貪婪匹配量詞:
X? X不出現(xiàn)或出現(xiàn)一次 (特殊字符"?"與{0,1}是相等的)
X* X不出現(xiàn)或出現(xiàn)多次 (特殊字符"*"與{0,}是相等的)
X+ X至少出現(xiàn)一次 (特殊字符"+"與 {1,}是相等的)
X{n} X出現(xiàn)n次
X{n,} X至少出現(xiàn)n次
X{n,m} X至少出現(xiàn)n次,但不會(huì)超過(guò)m次
7).Reluctant quantifiers:
X?? X, 不出現(xiàn)或出現(xiàn)一次
X*? X, 不出現(xiàn)或出現(xiàn)多次
X+? X, 至少出現(xiàn)一次
X{n}? X, 出現(xiàn)n次
X{n,}? X, 至少出現(xiàn)n次
X{n,m}? X, 至少出現(xiàn)n次,但不會(huì)超過(guò)m次
8).Possessive quantifiers:
X?+ X, 不出現(xiàn)或出現(xiàn)一次
X*+ X, 不出現(xiàn)或出現(xiàn)多次
X++ X, 至少出現(xiàn)一次
X{n}+ X, 出現(xiàn)n次
X{n,}+ X, 至少出現(xiàn)n次
X{n,m}+ X, 至少出現(xiàn)n次,但不會(huì)超過(guò)m次
9).邏輯運(yùn)算符:
XY Y跟在X后面
X|Y X 或 Y
(X) X, as a capturing group
10).反向引用:
"n Whatever the nth capturing group matched
11).Quotation:
" 引用后面的字符
"Q 引用所有的字符直到 "E 出現(xiàn)
"E 結(jié)束以 "Q 開(kāi)始的引用
12).Special constructs (non-capturing):
(?:X) X, as a non-capturing group
(?idmsux-idmsux) 匹配標(biāo)志開(kāi)關(guān)
(?idmsux-idmsux:X) X, as a non-capturing group with the given flags on
(?=X) X, via zero-width positive lookahead - off
(?!X) X, via zero-width negative lookahead
(? <=X) X, via zero-width positive lookbehind
(?(? > X) X, as an independent, non-capturing group
1).Backslashes, escapes, and quoting
反
斜杠字符('"')用來(lái)轉(zhuǎn)義,就像上面的表中定義的那樣,如果不這樣做的話可能會(huì)產(chǎn)生 歧義。因此,表達(dá)式""匹配
單個(gè)反斜杠,表達(dá)式"{匹配單個(gè)左花括號(hào)。 如果把反斜杠放在沒(méi)有定義轉(zhuǎn)移構(gòu)造的任何字母符號(hào)前面都會(huì)發(fā)生錯(cuò)誤,這些將被保留
到以后的正則表達(dá)式中擴(kuò)展。反斜杠可以放在任何 非字母符號(hào)前面,即使它沒(méi)有定義轉(zhuǎn)義構(gòu)造也不會(huì)發(fā)生錯(cuò)誤。
在java語(yǔ)言規(guī)范中指出,在java代碼中自符串中的反斜杠是必要的,不管用于Unicode轉(zhuǎn) 義,還是用于普通的字符轉(zhuǎn)義。因此,
為了保持正則表達(dá)式的完整性,在java字符串中要寫(xiě)兩個(gè)反斜杠。例如,在正則表達(dá)式
中字符'"b'代表退格,'""b'則代表單詞邊界。'"(hello")'是無(wú)效的,并且會(huì)產(chǎn)生編譯 時(shí)錯(cuò)誤,你必須用
'""(hello"")'來(lái)匹配(hello)。
2).Character Classes
字符類可以出現(xiàn)在其他字符類內(nèi)部,并且可以由并操作符和與操作符(&&)組成。并集操 作結(jié)果是,其中的任意字符,肯定在至少其中操作數(shù)中至少出現(xiàn)過(guò)一次。 交集的結(jié)果包括各個(gè)操作數(shù)中同時(shí)出現(xiàn)的任意字符。
字符類操作符的優(yōu)先級(jí)如下:(從高到低)
1 文字轉(zhuǎn)義 "x
2 集合 [...]
3 范圍 a-z
4 并集 [a-e][i-u]
5 交集 [a-z&&[aeiou]]
請(qǐng)注意各個(gè)字符類的有效字符集。例如,在字符類中,正則表達(dá)式.失去了它的特別含義 ,而-變成了元字符的范圍指示。
3).Line terminators
行結(jié)束符是一個(gè)或兩個(gè)字符序列,用來(lái)標(biāo)識(shí)輸入字符序列的一行的結(jié)束。下列都被認(rèn)為 是行結(jié)束符:
換行符 ('"n'),
回車換行符 (""r"n"),
回車符 ('"r'),
下一行 ('"u0085'),
行分隔符 ('"u2028'), 或段分隔符 ('"u2029).
如果激活了 UNIX_LINES 模式,唯一的行結(jié)束符就是換行符。
除非你指定了 DOTALL 標(biāo)志,否則正則表達(dá)式.匹配任何字符,只有行結(jié)束符除外。
確省情況時(shí),在整個(gè)輸入隊(duì)列中,正則表達(dá)式^和$忽略行結(jié)束符,只匹配開(kāi)始和結(jié)束。
如果激活了 MULTILINE 模式,則^匹配輸入的開(kāi)始和所有行結(jié)束符之后,除了整個(gè)輸入 的結(jié)束。
在MULTILINE 模式下,$匹配所有行結(jié)束符之前,和整個(gè)輸入的結(jié)束。
4).Groups and capturing
分組捕獲通過(guò)從左到右的順序,根據(jù)括號(hào)的數(shù)量類排序。例如,在表達(dá)式((A)(B(C)))中,有四個(gè)組:
1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)
0組代表整個(gè)表達(dá)式。
分
組捕獲之所以如此命名,是因?yàn)樵谄ヅ溥^(guò)程中,輸入序列的每一個(gè)與分組匹配的子序
列都會(huì)被保存起來(lái)。通過(guò)向后引用,被捕獲的子序列可以在后面的表達(dá)式中被再次使用。而且,在匹配操作結(jié)束以后還可以通過(guò)匹配器重新找到。與一個(gè)分組關(guān)聯(lián)的
被捕獲到的輸入通常是被保存的最近與這個(gè)分組相匹配的隊(duì)列的子隊(duì)列。如果一個(gè)分組被第二次求值,即使失敗,它的上一次被捕獲的值也會(huì)被保存起來(lái)。
例如,表達(dá)式(a(b)?)+匹配"aba","b"設(shè)為子分組。在開(kāi)始匹配的時(shí)候,以前被捕獲的輸入都將被清除。以(?開(kāi)始的分組是完全的,無(wú)需捕獲的分組不會(huì)捕獲任何文本,也不會(huì)計(jì)算分組總數(shù)。
5).Unicode support
Unicode Technical Report #18: Unicode Regular Expression Guidelines通過(guò)輕微的語(yǔ)法改變實(shí)現(xiàn)了更深層次的支持。
在java代碼中,像"u2014 這樣的轉(zhuǎn)義序列,java語(yǔ)言規(guī)范中?3.3提供了處理方法 。
為了便于使用從文件或鍵盤(pán)讀取的unicode轉(zhuǎn)義字符,正則表達(dá)式解析器也直接實(shí)現(xiàn)了這種轉(zhuǎn)移。因此,字符串""u2014"與"""u2014"雖然不相等,但是編譯進(jìn)同一種模式,可以匹配十六進(jìn)制數(shù)0x2014。
在
Perl中,unicode塊和分類被寫(xiě)入"p,"P。如果輸入有prop屬性,"p{prop}將會(huì)匹配,
而"P{prop}將不會(huì)匹配。塊通過(guò)前綴In指定,作為在nMongolian之中。分類通過(guò)任意的前綴Is指定: "p{L} 和 "p{IsL}
都引用 Unicode 字母。塊和分類可以 被使用在字符類的內(nèi)部或外部。
The Unicode Standard,
Version 3.0指出了支持的塊和分類。塊的名字在第14章和 Unicode CharacterDatabase中的
Blocks-3.txt 文件定義,但空格被剔除了。例如Basic Latin"變成了
"BasicLatin"。分類的名字被定義在88頁(yè),表4-5。