快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式教學
簡介
目錄
特殊字元
不可列印字元
正規表示式引擎內部
字元類別
字元類別減法
字元類別交集
簡寫字元類別
錨點
字詞邊界
交替
可選項目
重複
群組和擷取
反向參照
反向參照,第 2 部分
命名群組
相對反向參照
分支重設群組
自由間隔和註解
Unicode
模式修改器
原子群組
佔有量詞
前瞻和後顧
環顧,第 2 部分
將文字排除在比對之外
條件式
平衡群組
遞迴
子常式
無限遞迴
遞迴和量詞
遞迴和擷取
遞迴和反向參照
遞迴和回溯
POSIX 方括號表示式
長度為零的比對
繼續比對
本網站的更多內容
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS 饋送和部落格
RegexBuddy—Better than a regular expression tutorial!

簡寫字元類別

由於某些字元類別經常使用,因此提供了一系列簡寫字元類別。 \d[0-9] 的簡寫。在支援 Unicode 的大多數版本中,\d 包含所有字碼,來自所有字碼集。值得注意的例外是 JavaJavaScriptPCRE。這些 Unicode 版本僅使用 \d 比對 ASCII 字碼。

\w 代表「字元」。它總是符合 ASCII 字元 [A-Za-z0-9_]。請注意底線和數字的包含。在支援 Unicode 的大多數版本中,\w 包含許多其他腳本的字元。關於實際包含哪些字元,有很多不一致的地方。一般來說,字母和數字腳本的字母和數字會包含在內。底線以外的連接標點符號和非數字的數字符號可能會包含或不包含。 XML 架構XPath 甚至包含 \w 中的所有符號。同樣地,JavaJavaScriptPCRE 只會以 \w 符合 ASCII 字元。

\s 代表「空白字元」。同樣地,這實際上包含哪些字元取決於 regex 版本。在本教學課程中討論的所有版本中,它包含 [ \t\r\n\f]。也就是說:\s 符合空格、標籤、回車、換行或換頁。大多數版本也包含垂直標籤,但 Perl(5.18 版以前)和 PCRE(8.34 版以前)是值得注意的例外。在支援 Unicode 的版本中,\s 通常包含 Unicode「分隔符」類別中的所有字元。 JavaPCRE 再次成為例外。但 JavaScript 的確以 \s 符合所有 Unicode 空白。

縮寫字元類別可以在方括號內外使用。 \s\d 符合空白字元後接數字。 [\s\d] 符合單一字元,該字元為空白或數字。應用於 1 + 2 = 3 時,前者 regex 符合  2(空格二),而後者符合 1(一)。 [\da-fA-F] 符合十六進位數字,如果您的版本只以 \d 符合 ASCII 字元,則等於 [0-9a-fA-F]

否定簡寫字元類別

上述三個簡寫也都有否定版本。 \D 等同於 [^\d]\W[^\w] 的簡寫,而 \S 等同於 [^\s]

在方括號內使用否定簡寫時要小心。 [\D\S] 不等於 [^\d\s]。後者會配對任何既不是數字也不是空白字元字元。它會配對 x,但不會配對 8。然而,前者會配對任何既不是數字或不是空白字元的字元。由於所有數字都不是空白字元,而所有空白字元都不是數字,因此 [\D\S] 會配對任何字元;數字、空白字元或其他。

更多簡寫字元類別

雖然對 \d\s\w 的支援相當普遍,但有些 regex 風格支援額外的簡寫字元類別。 Perl 5.10 引入了 \h\v\h 符合水平空白,其中包括 tab 和 Unicode 類別「空白分隔符號」中的所有字元。它等於 [\t\p{Zs}]\v 符合「垂直空白」,其中包括 Unicode 標準中視為換行符號的所有字元。它等於 [\n\cK\f\r\x85\x{2028}\x{2029}]

PCRE 從 7.2 版開始也支援 \h\vPHP 從 5.2.2 版開始支援,Java 從 8 版開始支援,JGsoft 引擎 從 2 版開始支援。

如果您的風格支援 \h\v,那麼當您只想符合一種空白類型時,您絕對應該使用它們,而不是 \s。使用 \h 而不是 \s 來符合空白和 tab,可以確保您的 regex 符合不會意外溢出到下一行。

在許多其他 regex 風格中,\v 只符合 垂直 tab 字元。Perl、PCRE 和 PHP 從未支援過這一點,因此它們可以自由地賦予 \v 不同的意義。Java 4 到 7 和 JGsoft V1 確實使用 \v 來只符合垂直 tab。Java 8 和 JGsoft V2 還是改變了這個代碼的意義。垂直 tab 也是一個垂直空白字元。為了避免混淆,上述段落使用 \cK 來表示垂直 tab。

Boost 支援 \h,從 1.42 版開始。Boost 1.42 及更新版本支援 \v 作為僅在字元類別之外的簡寫。 [\v] 在 Boost 中只比對垂直定位標籤。

Ruby 1.9 及更新版本有自己的 \h 版本。它比對單一十六進位數字,就像 [0-9a-fA-F] 一樣。 \v 在 Ruby 中是垂直定位標籤。

XML 字元類別

XML SchemaXPathJGsoft V2 正規表示式支援其他四個其他正規表示式樣式不支援的簡寫。 \i 比對任何可能為 XML 名稱第一個字元的字元。 \c 比對任何可能出現在 XML 名稱第一個字元後的字元。 \I\C 分別為否定的簡寫。請注意, \c 簡寫語法與許多其他正規表示式樣式中使用的 控制字元 語法衝突。

您可以使用方括號表示法在字元類別內外使用這四個簡寫。它們對於驗證 XML 參照和 XML schema 中的值非常有用。正規表示式 \i\c* 比對 XML 名稱,例如 xml:schema

The regex <\i\c*\s*> matches an opening XML tag without any attributes. </\i\c*\s*> matches any closing tag. <\i\c*(\s+\i\c*\s*=\s*("[^"]*"|'[^']*'))*\s*> matches an opening tag with any number of attributes. Putting it all together, <(\i\c*(\s+\i\c*\s*=\s*("[^"]*"|'[^']*'))*|/\i\c*)\s*> matches either an opening tag with attributes or a closing tag.

本教學課程中討論的其他 regex 風味不支援 XML 字元類別。如果你的 XML 檔案是純 ASCII,你可以使用 [_:A-Za-z] 代表 \i,以及 [-._:A-Za-z0-9] 代表 \c。如果你想要允許 XML 標準允許的所有 Unicode 字元,那麼你最後會得到一些相當長的 regex。你會使用以下內容取代 \i

[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]

你會使用以下內容取代 \c

[-.0-9:A-Z_a-z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]