JavaTM 2 Platform
Standard Ed. 6

java.util.regex
類別 Pattern

java.lang.Object
  繼承者 java.util.regex.Pattern
所有已實作的介面:
Serializable

public final class Pattern
extends Object
implements Serializable

正則表達式的編譯表示形式。

指定為字元串的正則表達式必須首先被編譯為此類別的實例。然後,可將得到的網要用於創建 Matcher 物件,依照正則表達式,該物件可以與任意字元序列比對。執行比對所涉及的所有狀態都駐留在比對器中,所以多個比對器可以共享同一網要。

因此,典型的調用順序是

 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();

在僅使用一次正則表達式時,可以方便地通過此類別定義 matches 方法。此方法編譯表達式並在單個調用中將輸入序列與其比對。語句

 boolean b = Pattern.matches("a*b", "aaaaab");
等效於上面的三個語句,儘管對於重複的比對而言它效率不高,因為它不允許重用已編譯的網要。

此類別的實例是不可變的,可供多個共時執行緒安全使用。Matcher 類別的實例用於此目的則不安全。

正則表達式的建構摘要

非捕獲組
建構 比對
 
字元
x 字元 x
\\ 反斜線字元
\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 回車(Enter)符 ('\u000D')
\f 換頁符 ('\u000C')
\a 報警 (bell) 符 ('\u0007')
\e 轉義符 ('\u001B')
\cx 對應於 x 的控制符
 
字元類別
[abc] abc(簡單類別)
[^abc] 任何字元,除了 abc(否定)
[a-zA-Z] azAZ,兩頭的字母包括在內(範圍)
[a-d[m-p]] admp[a-dm-p](並集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az,除了 bc[ad-z](減去)
[a-z&&[^m-p]] az,而非 mp[a-lq-z](減去)
 
預定義字元類別
. 任何字元(與行結束符可能比對也可能不比對)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字元:[ \t\n\x0B\f\r]
\S 非空(null)白字元:[^\s]
\w 單詞字元:[a-zA-Z_0-9]
\W 非單詞字元:[^\w]
 
POSIX 字元類別(僅 US-ASCII)
\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}\x20]
\p{Blank} 空格或製表符:[ \t]
\p{Cntrl} 控制字元:[\x00-\x1F\x7F]
\p{XDigit} 十六進制數字:[0-9a-fA-F]
\p{Space} 空白字元:[ \t\n\x0B\f\r]
 
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()
 
Unicode 塊和類別別的類別
\p{InGreek} Greek 塊(簡單)中的字元
\p{Lu} 大寫字母(簡單類別別
\p{Sc} 貨幣符號
\P{InGreek} 所有字元,Greek 塊中的除外(否定)
[\p{L}&&[^\p{Lu}]]  所有字母,大寫字母除外(減去)
 
邊界比對器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個比對的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾
 
Greedy 數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超過 m
 
Reluctant 數量詞
X?? X,一次或一次也沒有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n
X{n,}? X,至少 n
X{n,m}? X,至少 n 次,但是不超過 m
 
Possessive 數量詞
X?+ X,一次或一次也沒有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n
X{n,}+ X,至少 n
X{n,m}+ X,至少 n 次,但是不超過 m
 
Logical 運算符
XY X 後跟 Y
X|Y XY
(X) X,作為捕獲組
 
Back 參考
\n 任何比對的 nth 捕獲組
 
參考
\ Nothing,但是參考以下字元
\Q Nothing,但是參考所有字元,直到 \E
\E Nothing,但是結束從 \Q 開始的參考
 
特殊建構(非捕獲)
(?:X) X,作為非捕獲組
(?idmsux-idmsux)  Nothing,但是將比對標誌i d m s u x on - off
(?idmsux-idmsux:X)   X,作為帶有給定標誌 i d m s u x on - off
(?=X) X,通過零寬度的正 lookahead
(?!X) X,通過零寬度的負 lookahead
(?<=X) X,通過零寬度的正 lookbehind
(?<!X) X,通過零寬度的負 lookbehind
(?>X) X,作為獨立的非捕獲組

反斜線、轉義和參考

反斜線字元 ('\') 用於參考轉義建構,如上表所定義的,同時還用於參考其他將被解釋為非轉義建構的字元。因此,表達式 \\ 與單個反斜線比對,而 \{ 與左括號比對。

在不表示轉義建構的任何字母字元前使用反斜線都是錯誤的;它們是為將來擴展正則表達式語言保留的。可以在非字母字元前使用反斜線,不管該字元是否非轉義建構的一部分。

根據 Java Language Specification 的要求,Java 源程式碼的字元串中的反斜線被解釋為 Unicode 轉義或其他字元轉義。因此必須在字元串文字值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 位元組碼編譯器解釋。例如,當解釋為正則表達式時,字元串文字值 "\b" 與單個退格字元比對,而 "\\b" 與單詞邊界比對。字元串文字值 "\(hello\)" 是非法的,將導致編譯時錯誤;要與字元串 (hello) 比對,必須使用字元串文字值 "\\(hello\\)"

字元類別

字元類別可以出現在其他字元類別中,並且可以包含並集運算符(隱式)和交集運算符 (&&)。並集運算符表示至少包含其某個操作數類別中所有字元的類別。交集運算符表示包含同時位於其兩個操作數類別中所有字元的類別。

字元類別運算符的優先級如下所示,按從最高到最低的順序排列:

1     文字值轉義     \x
2     分組 [...]
3     範圍 a-z
4     並集 [a-e][i-u]
5     交集 [a-z&&[aeiou]]

注意,元字元的不同集合實際上位於字元類別的內部,而非字元類別的外部。例如,正則表達式 . 在字元類別內部就失去了其特殊意義,而表達式 - 變成了形成元字元的範圍。

行結束符

行結束符 是一個或兩個字元的序列,標記輸入字元序列的行結尾。以下程式碼被識別為行結束符:

如果啟動 UNIX_LINES 網要,則新行符是唯一識別的行結束符。

如果未指定 DOTALL 標誌,則正則表達式 . 可以與任何字元(行結束符除外)比對。

預設情況下,正則表達式 ^$ 忽略行結束符,僅分別與整個輸入序列的開頭和結尾比對。如果啟動 MULTILINE 網要,則 ^ 在輸入的開頭和行結束符之後(輸入的結尾)才發生比對。處於 MULTILINE 網要中時,$ 僅在行結束符之前或輸入序列的結尾處比對。

組和捕獲

捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式 ((A)(B(C))) 中,存在四個這樣的組:

1     ((A)(B(C)))
2     \A
3     (B(C))
4     (C)

組零始終代表整個表達式。

之所以這樣命名捕獲組是因為在比對中,保存了與這些組比對的輸入序列的每個子序列。捕獲的子序列稍後可以通過 Back 參考在表達式中使用,也可以在比對操作完成後從比對器獲取。

與組關聯的捕獲輸入始終是與組最近比對的子序列。如果由於量化的緣故再次計算了組,則在第二次計算失敗時將保留其以前捕獲的值(如果有的話)例如,將字元串 "aba" 與表達式 (a(b)?)+ 相比對,會將第二組設置為 "b"。在每個比對的開頭,所有捕獲的輸入都會被丟棄。

(?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計進行計數。

Unicode 支持

此類別符合 Unicode Technical Standard #18:Unicode Regular Expression Guidelines 第 1 級和 RL2.1 Canonical Equivalents。

Java 源程式碼中的 Unicode 轉義序列(如 \u2014)是按照 Java Language Specification 的 第 3.3 節中的描述處理的。這樣的轉義序列還可以由正則表達式解析器直接實作,以便在從檔案或鍵盤擊鍵讀取的表達式中使用 Unicode 轉義。因此,可以將不相等的字元串 "\u2014""\\u2014" 編譯為相同的網要,從而與帶有十六進制值 0x2014 的字元比對。

與 Perl 中一樣,Unicode 塊和類別別是使用 \p\P 建構編寫的。如果輸入具有屬性 prop,則與 \p{prop} 比對,而輸入具有該屬性時與 \P{prop} 不比對。塊使用前綴 In 指定,與在 InMongolian 中一樣。可以使用可選前綴 Is 指定類別別:\p{L}\p{IsL} 都表示 Unicode 字母的類別別。塊和類別別在字元類別的內部和外部都可以使用。

受支持的類別別是由 Character 類別指定版本中的 The Unicode Standard 的類別別。類別別名稱是在 Standard 中定義的,即標準又豐富。Pattern 所支持的塊名稱是 UnicodeBlock.forName 所接受和定義的有效塊名稱。

行為類似 java.lang.Character boolean 是 methodname 方法(廢棄的類別別除外)的類別別,可以通過相同的 \p{prop} 語法來提供,其中指定的屬性具有名稱 javamethodname

與 Perl 5 相比較

Pattern 引擎用有序替換項執行傳統上基於 NFA 的比對,與 Perl 5 中進行的相同。

此類別不支持 Perl 建構:

此類別支持但 Perl 不支持的建構:

與 Perl 的顯著不同點是:

有關正則表達式建構行為更準確的描述,請參見 Mastering Regular Expressions, 2nd Edition,該書由 Jeffrey E. F. Friedl、O'Reilly 和 Associates 合著,於 2002 年出版。

從以下版本開始:
1.4
另請參見:
String.split(String, int), String.split(String), 序列化表格

欄位摘要
static int CANON_EQ
          啟用規範等價。
static int CASE_INSENSITIVE
          啟用不區分大小寫的比對。
static int COMMENTS
          網要中允許空白和註釋。
static int DOTALL
          啟用 dotall 網要。
static int LITERAL
          啟用網要的文字值解析。
static int MULTILINE
          啟用多行網要。
static int UNICODE_CASE
          啟用 Unicode 感知的大小寫折疊。
static int UNIX_LINES
          啟用 Unix 行網要。
 
方法摘要
static Pattern compile(String regex)
          將給定的正則表達式編譯到網要中。
static Pattern compile(String regex, int flags)
          將給定的正則表達式編譯到具有給定標誌的網要中。
 int flags()
          返回此網要的比對標誌。
 Matcher matcher(CharSequence input)
          創建比對給定輸入與此網要的比對器。
static boolean matches(String regex, CharSequence input)
          編譯給定正則表達式並嘗試將給定輸入與其比對。
 String pattern()
          返回在其中編譯過此網要的正則表達式。
static String quote(String s)
          返回指定 String 的文字值網要 String
 String[] split(CharSequence input)
          圍繞此網要的比對拆分給定輸入序列。
 String[] split(CharSequence input, int limit)
          圍繞此網要的比對拆分給定輸入序列。
 String toString()
          返回此網要的字元串表示形式。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

欄位詳細資訊

UNIX_LINES

public static final int UNIX_LINES
啟用 Unix 行網要。

在此網要中,.^$ 的行為中僅識別 '\n' 行結束符。

通過嵌入式標誌表達式 (?d) 也可以啟用 Unix 行網要。

另請參見:
常數欄位值

CASE_INSENSITIVE

public static final int CASE_INSENSITIVE
啟用不區分大小寫的比對。

預設情況下,不區分大小寫的比對假定僅比對 US-ASCII 字元集中的字元。可以通過指定 UNICODE_CASE 標誌連同此標誌來啟用 Unicode 感知的、不區分大小寫的比對。

通過嵌入式標誌表達式  (?i) 也可以啟用不區分大小寫的比對。

指定此標誌可能對性能產生一些影響。

另請參見:
常數欄位值

COMMENTS

public static final int COMMENTS
網要中允許空白和註釋。

此網要將忽略空白和在結束行之前以 # 開頭的嵌入式註釋。

通過嵌入式標誌表達式  (?x) 也可以啟用註釋網要。

另請參見:
常數欄位值

MULTILINE

public static final int MULTILINE
啟用多行網要。

在多行網要中,表達式 ^$ 僅分別在行結束符前後比對,或者在輸入序列的結尾處比對。預設情況下,這些表達式僅在整個輸入序列的開頭和結尾處比對。

通過嵌入式標誌表達式 (?m) 也可以啟用多行網要。

另請參見:
常數欄位值

LITERAL

public static final int LITERAL
啟用網要的文字值解析。

指定此標誌後,指定網要的輸入字元串就會作為文字值字元序列來對待。輸入序列中的元字元或轉義序列不具有任何特殊意義。

標誌 CASE_INSENSITIVE 和 UNICODE_CASE 在與此標誌一起使用時將對比對產生影響。其他標誌都變得多餘了。

不存在可以啟用文字值解析的嵌入式標誌字元。

從以下版本開始:
1.5
另請參見:
常數欄位值

DOTALL

public static final int DOTALL
啟用 dotall 網要。

在 dotall 網要中,表達式 . 可以比對任何字元,包括行結束符。預設情況下,此表達式不比對行結束符。

通過嵌入式標誌表達式 (?s) 也可以啟用 dotall 網要(s 是 "single-line" 網要的助記符,在 Perl 中也使用它)。

另請參見:
常數欄位值

UNICODE_CASE

public static final int UNICODE_CASE
啟用 Unicode 感知的大小寫折疊。

指定此標誌後,由 CASE_INSENSITIVE 標誌啟用時,不區分大小寫的比對將以符合 Unicode Standard 的方式完成。預設情況下,不區分大小寫的比對假定僅比對 US-ASCII 字元集中的字元。

通過嵌入式標誌表達式 (?u) 也可以啟用 Unicode 感知的大小寫折疊。

指定此標誌可能對性能產生影響。

另請參見:
常數欄位值

CANON_EQ

public static final int CANON_EQ
啟用規範等價。

指定此標誌後,當且僅當其完整規範分解比對時,兩個字元才可視為比對。例如,當指定此標誌時,表達式 "a\u030A" 將與字元串 "\u00E5" 比對。預設情況下,比對不考慮採用規範等價。

不存在可以啟用規範等價的嵌入式標誌字元。

指定此標誌可能對性能產生影響。

另請參見:
常數欄位值
方法詳細資訊

compile

public static Pattern compile(String regex)
將給定的正則表達式編譯到網要中。

參數:
regex - 要編譯的表達式
拋出:
PatternSyntaxException - 如果表達式的語法無效

compile

public static Pattern compile(String regex,
                              int flags)
將給定的正則表達式編譯到具有給定標誌的網要中。

參數:
regex - 要編譯的表達式
flags - 比對標誌,可能包括 CASE_INSENSITIVEMULTILINEDOTALLUNICODE_CASECANON_EQUNIX_LINESLITERALCOMMENTS 的位遮罩碼
拋出:
IllegalArgumentException - 如果在 flags 中設置與定義的比對標誌不對應的位值
PatternSyntaxException - 如果表達式的語法無效

pattern

public String pattern()
返回在其中編譯過此網要的正則表達式。

返回:
網要的源程式碼

toString

public String toString()

返回此網要的字元串表示形式。此為在其中編譯過此網要的正則表達式。

覆寫:
類別 Object 中的 toString
返回:
網要的字元串表示形式
從以下版本開始:
1.5

matcher

public Matcher matcher(CharSequence input)
創建比對給定輸入與此網要的比對器。

參數:
input - 要比對的字元序列
返回:
此網要的新比對器

flags

public int flags()
返回此網要的比對標誌。

返回:
編譯此網要時指定的比對標誌

matches

public static boolean matches(String regex,
                              CharSequence input)
編譯給定正則表達式並嘗試將給定輸入與其比對。

調用此便捷方法的形式

Pattern.matches(regex, input);
與表達式
Pattern.compile(regex).matcher(input).matches() 
的行為完全相同。

如果要多次使用一種網要,編譯一次後重用此網要比每次都調用此方法效率更高。

參數:
regex - 要編譯的表達式
input - 要比對的字元序列
拋出:
PatternSyntaxException - 如果表達式的語法無效

split

public String[] split(CharSequence input,
                      int limit)
圍繞此網要的比對拆分給定輸入序列。

此方法返回的陣列包含輸入序列的子字元串,由比對此網要的另一子序列或輸入序列的結尾終止。陣列中子字元串的順序與其在輸入中出現的順序相同。如果此網要與輸入的任何子序列都不比對,那麼得到的陣列僅包含一個元素,即字元串形式的輸入序列。

limit 參數控制應用網要的次數,從而影響結果陣列的長度。如果限制 n 大於零,那麼網要至多應用 n> - 1 次,陣列的長度不大於 n,並且陣列的最後條目將包含除最後的比對定界符之外的所有輸入。如果 n 非正,那麼將應用網要的次數不受限制,並且陣列可以為任意長度。如果 n 為零,那麼應用網要的次數不受限制,陣列可以為任意長度,並且將丟棄尾部空字元串。

例如,輸入 "boo:and:foo" 將產生以下結果及參數:

Regex    

Limit    

Result    

: 2 { "boo", "and:foo" }
: 5 { "boo", "and", "foo" }
: -2 { "boo", "and", "foo" }
o 5 { "b", "", ":and:f", "", "" }
o -2 { "b", "", ":and:f", "", "" }
o 0 { "b", "", ":and:f" }

參數:
input - 要拆分的字元序列
limit - 結果閾值,如上文中所述
返回:
根據圍繞此網要的比對來拆分輸入後所計算的字元串陣列

split

public String[] split(CharSequence input)
圍繞此網要的比對拆分給定輸入序列。

此方法的工作方式類似於使用給定的輸入序列和限制參數零調用兩參數 (java.lang.CharSequence, int) split} 方法。因此,得到的陣列中不包括尾部空字元串。

例如,輸入 "boo:and:foo" 將產生以下結果及表達式:

Regex    

Result

: { "boo", "and", "foo" }
o { "b", "", ":and:f" }

參數:
input - 要拆分的字元序列
返回:
根據圍繞此網要的比對來拆分輸入後所計算的字元串陣列

quote

public static String quote(String s)
返回指定 String 的文字值網要 String

此方法產生一個 String,可以將其用於創建與字元串 s 比對的 Pattern,就好像它是文字值網要一樣。

輸入序列中的元字元和轉義序列不具有任何特殊意義。

參數:
s - 要文字值化的字元串
返回:
文字值字元串替換
從以下版本開始:
1.5

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only