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

字元類別或字元集

使用「字元類別」,也稱為「字元集」,您可以告訴正規表示式引擎只比對幾個字元中的其中一個。只要將您要比對的字元放在方括號中即可。如果您要比對 a 或 e,請使用 [ae]。您可以在 gr[ae]y 中使用此方法,以比對 graygrey。如果您不知道您正在搜尋的文件是使用美式或英式英語撰寫,這將非常有用。

字元類別只比對單一字元。 gr[ae]y 沒有比對到 graaygraey 或任何類似的字串。字元類別中字元的順序並不重要。結果相同。

您可以在字元類別內使用連字號來指定字元範圍。 [0-9] 匹配 0 到 9 之間的單一數字。您可以使用多個範圍。 [0-9a-fA-F] 匹配單一十六進位數字,不分大小寫。您可以結合範圍和單一字元。 [0-9a-fxA-FX] 匹配十六進位數字或字母 X。同樣地,字元和範圍的順序並不重要。

字元類別是正規表示式中最常用的功能之一。您可以找到一個字詞,即使它拼寫錯誤,例如 sep[ae]r[ae]teli[cs]en[cs]e。您可以使用 [A-Za-z_][A-Za-z_0-9]* 在程式語言中找到識別碼。您可以使用 0[xX][A-Fa-f0-9]+ 找到 C 式十六進位數字。

否定字元類別

在開頭方括號後輸入插入符號會否定字元類別。結果是字元類別會符合在字元類別中的任何字元。與不同,否定的字元類別也會符合(隱形的)換行字元。如果您不希望否定的字元類別符合換行,您需要在類別中包含換行字元。[^0-9\r\n]會符合任何不是數字或換行的字元。

重要的是要記住,否定的字元類別仍然必須符合一個字元。q[^u]表示:「一個 q 後面不接 u」。它的意思是:「一個 q 後面接一個不是 u 的字元」。它不符合字串Iraq中的 q。它符合字串Iraq is a country中的 q 和 q 後面的空格。的確:空格會成為整體符合的一部分,因為它是否定的字元類別在上述正規表示法中符合的「不是 u 的字元」。如果您希望正規表示法符合兩個字串中的 q,而且只有 q,您需要使用負向前瞻q(?!u)。但我們稍後會討論到。

字元類別中的元字元

在大部分正規表示法類型中,字元類別中唯一的特殊字元或元字元是結尾方括號]、反斜線\、插入符號^和連字元-常見的元字元在字元類別中是正常的字元,不需要反斜線來跳脫。要搜尋星號或加號,請使用[+*]。如果您在字元類別中跳脫正規元字元,您的正規表示法會正常運作,但這樣會大幅降低可讀性。

若要將反斜線作為字元類別中不具任何特殊意義的字元,您必須使用另一個反斜線來跳脫它。 [\\x] 符合反斜線或 x。可以透過反斜線跳脫或將其置於不會具有特殊意義的位置,來包含右括號 ]、插入符號 ^ 和連字元 -POSIXGNU 風味例外。它們將字元類別中的反斜線視為字面字元。因此,使用這些風味時,您無法跳脫字元類別中的任何內容。

若要將未跳脫的插入符號作為字面值包含,請將其置於任何位置,但不得置於右括號之後。 [x^] 符合 x 或插入符號。這適用於本教學課程中討論的所有風味。

您可以透過將未跳脫的右括號置於右括號之後或否定插入符號之後,來包含未跳脫的右括號。 []x] 符合右括號或 x。 [^]x] 符合任何不是右括號或 x 的字元。這不適用於 JavaScript,它將 [] 視為永遠無法符合的空字元類別,並將 [^] 視為符合任何單一字元的否定空字元類別。Ruby 將空字元類別視為錯誤。因此,JavaScript 和 Ruby 都需要使用反斜線跳脫右括號,才能將其作為字元類別中的字面值包含。

連字符可以包含在開括號的正後方、閉括號的正前方,或否定符號的正後方。 [-x][x-] 都會比對出 x 或連字符。 [^-x][^x-] 會比對出任何不是 x 或連字符的字元。這適用於本教學課程中討論的所有風格。在字元類別中其他無法形成範圍的位置的連字符可能會被解釋為字面值或錯誤。正規表示法風格在這方面相當不一致。

許多在字元類別外運作的正規表示法代碼也可以在字元類別內使用。這包括字元跳脫、八進位跳脫和十六進位跳脫,用於 不可列印字元。對於支援 Unicode 的風格,也包括 Unicode 字元跳脫和 Unicode 屬性。 [$\u20AC] 會比對出美元或歐元符號,假設您的正規表示法風格支援 Unicode 跳脫。

重複字元類別

如果您使用 ?*+ 營運子重複字元類別,您重複的是整個字元類別。您並未重複它比對到的字元。正規表示法 [0-9]+ 可以比對出 837222

如果您想要重複比對到的字元,而不是類別,您需要使用反向參照。 ([0-9])\1+ 會比對出 222,但不會比對出 837。當套用於字串 833337 時,它會比對出此字串中間的 3333。如果您不想要這樣,您需要使用 環顧

深入了解 Regex 引擎

如前所述:字元類別中的字元順序並不重要。 gr[ae]yIs his hair grey or gray? 中配對 grey,因為那是最左邊的配對。我們已經看過 引擎如何套用僅由字面字元組成的 regex。現在我們將看到它如何套用具有多個排列的 regex。也就是說:gr[ae]y 可以同時配對 graygrey

字串中的前十二個字元沒有發生任何值得注意的事情。引擎在每一步都無法配對 g,並繼續處理字串中的下一個字元。當引擎到達第 13 個字元時,g 已配對。然後,引擎嘗試將 regex 的其餘部分與文字配對。regex 中的下一個標記是字面 r,它與文字中的下一個字元配對。因此,下一個標記 [ae] 會嘗試與文字中的下一個字元 (e) 配對。字元類別為引擎提供兩個選項:配對 a 或配對 e。它首先嘗試配對 a,但失敗了。

但是,由於我們使用的是 regex 導向引擎,因此它必須繼續嘗試配對 regex 模式的所有其他排列,然後才能決定無法從第 13 個字元開始將 regex 與文字配對。因此,它繼續使用另一個選項,並發現 ee 配對。最後一個 regex 標記是 y,它也可以與下一個字元配對。引擎已找到從第 13 個字元開始與文字的完整配對。它將 grey 作為配對結果傳回,不再進一步尋找。同樣地,即使我們將 a 放在字元類別中,而 gray 可以與字串中的配對,但最左邊的配對仍會傳回。但是,引擎根本沒有達到那一步,因為在它的左邊發現了另一個同樣有效的配對。只有當您告訴 regex 引擎在第一次配對後繼續在主旨字串的其餘部分尋找第二次配對時,gray 才會配對。