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