?
這兩天剛好想學習正則表達式,不過網上找不到什么好資料,只好自己看api,今天上午
邊看邊翻譯了一些,由于第一次翻譯,錯誤很多,望各位不吝指正:
java.util.regex.Pattern
正則表達式的一種已編譯的實現。
正則表達式通常以字符串的形式出現,它首先必須被編譯為Pattern類的一個實例。
結果模型可以用來生成一個Matcher,它(生成的Macher實例)可以匹配根據
這個正則表達式生成的任意字符序列。在實現一個匹配器中的匹配時包括了
任意多的情況,并且多個匹配器可以共享同一個匹配模式。
下面是一個典型的調用次序:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
為了方便使用,Pattern類也定義了matches()方法,
因為有時候一個正則表達使只用到一次。
在一次調用中,這個方法首先編譯表達式,然后匹配輸入的序列。
下面這個句子:
boolean b = Pattern.matches("a*b", "aaaaab");
等價于上面的三個句子。但是由于它不允許便以后的模式被重用,所以在需要重復匹配
時顯然比上面的方法效率要低。
Pattern類的實例不能被改變,并且是線程安全的。注意,Matcher類并不是線程安全的
。
正則表達式結構簡介:
字符:
x?? 字符 x
\\? 反斜杠
\0n???? 十進制數 (0 <= n <= 7)
\0nn??? 十進制數 0nn (0 <= n <= 7)
\0mnn?? 十進制數 0mnn (0 <= m <= 3, 0 <= n <= 7)
\xhh??? 十六進制數 0xhh
\uhhhh? 十六進制數 0xhhhh
\t? 制表符 ('\u0009')
\n? 換行符 ('\u000A')
\r? 回車符 ('\u000D')
\f? The form-feed character ('\u000C')
\a? The alert (bell) character ('\u0007')
\e? esc符號 ('\u001B')
\cx???? x 對應的控制符
?
字符類
[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](子集)
?
預定義字符序列
.?? 任意字符 (也可能不包括行結束符)
\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 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]
?
Unicode 字符類
\p{InGreek}???? 希臘語種的字符 (simple block)
\p{Lu}????? 大寫字母 (simple category)
\p{Sc}????? 貨幣符號
\P{InGreek}???? 除希臘語種字符外的任意字符 (negation)
[\p{L}&&[^\p{Lu}]]? 除大寫字母外的任意字符 (subtraction)
?
邊界匹配器
^?? 一行的開始
$?? 一行的結束
\b? 單詞邊界
\B? 非單詞邊界
\A? 輸入的開始
\G? 當前匹配的結束
\Z? The end of the input but for the final terminator, if any
\z? 輸入的結束
?
Greedy quantifiers
貪婪匹配量詞(Greedy quantifiers )(不知道翻譯的對不對)
X?????????? X不出現或出現一次
X*????????? X不出現或出現多次
X+????????? X至少出現一次
X{n}??????? X出現n次
X{n,}?????? X至少出現n次
X{n,m}????? X至少出現n次,但不會超過m次
?
Reluctant quantifiers
X?????????? X, 不出現或出現一次
X*????????? X, 不出現或出現多次
X+????????? X, 至少出現一次
X{n}??????? X, 出現n次
X{n,}?????? X, 至少出現n次?
X{n,m}????? X, 至少出現n次,但不會超過m次
?
Possessive quantifiers
X?+???? X, 不出現或出現一次
X*+???????? X, 不出現或出現多次
X++???????? X, 至少出現一次
X{n}+?????? X, 出現n次
X{n,}+????? X, 至少出現n次?
X{n,m}+???? X, 至少出現n次,但不會超過m次
?
邏輯運算符
XY? Y跟在X后面
X|Y???? X 或 Y
(X)???? X, as a capturing group
?
反向引用
\n? Whatever the nth capturing group matched
?
Quotation
\?? 引用后面的字符
\Q? 引用所有的字符直到 \E 出現
\E? 結束以 \Q 開始的引用
?
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
- off
(?=X)?????????? X, via zero-width positive lookahead
(?!X)?????????? X, via zero-width negative lookahead
(?<=X)????????? X, via zero-width positive lookbehind
(?<!X)????????? X, via zero-width negative lookbehind
(?>X)?????????? X, as an independent, non-capturing group
Backslashes, escapes, and quoting
反斜杠字符('\')用來轉義,就像上面的表中定義的那樣,如果不這樣做的話可能會產生
歧義。因此,表達式\\匹配
單個反斜杠,表達式\{匹配單個左花括號。
如果把反斜杠放在沒有定義轉移構造的任何字母符號前面都會發生錯誤,這些將被保留
到以后的正則表達式中擴展。反斜杠可以放在任何
非字母符號前面,即使它沒有定義轉義構造也不會發生錯誤。
在java語言規范中指出,在java代碼中自符串中的反斜杠是必要的,不管用于Unicode轉
義,還是用于普通的字符轉義。因此,
為了保持正則表達式的完整性,在java字符串中要寫兩個反斜杠。例如,在正則表達式
中字符'\b'代表退格,'\\b'則代表單詞邊界。'\(hello\)'是無效的,并且會產生編譯
時錯誤,你必須用
'\\(hello\\)'來匹配(hello)。
Character Classes
字符類可以出現在其他字符類內部,并且可以由并操作符和與操作符(&&)組成。并集操
作結果是,其中的任意字符,肯定在至少其中操作數中至少出現過一次。
交集的結果包括各個操作數中同時出現的任意字符。
字符類操作符的優先級如下:(從高到低)
1???? 文字轉義????? \x
2???? 集合????? [...]
3???? 范圍????? a-z
4???? 并集????? [a-e][i-u]
5???? 交集????? [a-z&&[aeiou]]
請注意各個字符類的有效字符集。例如,在字符類中,正則表達式.失去了它的特別含義
,而-變成了元字符的范圍指示。
Line terminators
行結束符是一個或兩個字符序列,用來標識輸入字符序列的一行的結束。下列都被認為
是行結束符:
換行符????? ('\n'),
回車換行符? ("\r\n"),
回車符????? ('\r'),
下一行????? ('\u0085'),
行分隔符??? ('\u2028'), 或
段分隔符??? ('\u2029).
如果激活了 UNIX_LINES 模式,唯一的行結束符就是換行符。
除非你指定了 DOTALL 標志,否則正則表達式.匹配任何字符,只有行結束符除外。
確省情況時,在整個輸入隊列中,正則表達式^和$忽略行結束符,只匹配開始和結束。
如果激活了 MULTILINE 模式,則^匹配輸入的開始和所有行結束符之后,除了整個輸入
的結束。
在MULTILINE 模式下,$匹配所有行結束符之前,和整個輸入的結束。
Groups and capturing
分組捕獲通過從左到右的順序,根據括號的數量類排序。例如,在表達式((A)(B(C)))中
,有四個組:
1???? ((A)(B(C)))
2???? (A)
3???? (B(C))
4???? (C)
0組代表整個表達式。
分組捕獲之所以如此命名,是因為在匹配過程中,輸入序列的每一個與分組匹配的子序
列都會被保存起來。通過向后引用,被捕獲的子序列可以在后面的表達式中被再次使用
。
而且,在匹配操作結束以后還可以通過匹配器重新找到。
與一個分組關聯的被捕獲到的輸入通常是被保存的最近與這個分組相匹配的隊列的子隊
列。如果一個分組被第二次求值,即使失敗,它的上一次被捕獲的值也會被保存起來。
例如,
表達式(a(b)?)+匹配"aba","b"設為子分組。在開始匹配的時候,以前被捕獲的輸入都
將被清除。
以(?開始的分組是完全的,無需捕獲的分組不會捕獲任何文本,也不會計算分組總數。
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 Character
Database中的 Blocks-3.txt 文件定義,
但空格被剔除了。例如Basic Latin"變成了? "BasicLatin"。分類的名字被定義在88頁
,表4-5。
Comparison to Perl 5
Pattern類不支持的Perl構造:
條件構造??? (?{X}) 和 (?(condition)X|Y),
嵌入代碼構造??? (?{code}) 和 (??{code}),
嵌入注釋語法??? (?#comment), 和
操作預處理?? \l \u, \L, and \U.
Perl不支持的Pattern類構造:
所有權量詞,它貪婪匹配任意多。
字符類交集和并集。
Notable differences from Perl:
下面的對我無關緊要,就不翻譯了。
?
第一次翻譯東西,有很多都不懂,明明心里知道,可就是不知道該怎么寫,我知道有很多錯誤,希望各位大俠多多指正,多謝!