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

字元類別減法

XML SchemaXPath.NET(2.0 版及更新版本)和 JGsoft 正則表達式風格支援字元類別減法。這使得比對存在於一個清單(字元類別)中的任何單一字元,但不存在於另一個清單(減去類別)中,變得容易。其語法為 [類別-[減去]]。如果連字號後的字元是開括號,這些風格會將連字號解釋為減法運算子,而不是範圍運算子。您可以在減去字元類別中使用完整的字元類別語法。

字元類別 [a-z-[aeiuo]] 符合單一非母音字母。換句話說:符合單一輔音。在沒有字元類別減法或 交集 的情況下,執行此動作的唯一方法是列出所有輔音:[b-df-hj-np-tv-z]

字元類別 [\p{Nd}-[^\p{IsThai}]] 符合任何單一泰文數字。基本類別符合任何 Unicode 數字。所有非泰文字元都從該類別中減去。 [\p{Nd}-[\P{IsThai}]] 執行相同的動作。 [\p{IsThai}-[^\p{Nd}]][\p{IsThai}-[\P{Nd}]] 也會透過從泰文字元中減去所有非數字,來符合單一泰文數字。

巢狀字元類別減法

由於您可以在減去的字元類別中使用完整的字元類別語法,因此您可以從要減去的類別中減去一個類別。 [0-9-[0-6-[0-3]]] 首先從 0-6 中減去 0-3,產生 [0-9-[4-6]],或 [0-37-9],符合字串 0123789 中的任何字元。

類別減法必須始終是字元類別中的最後一個元素。 [0-9-[4-6]a-f] 不是有效的正規表示式。應改寫為 [0-9a-f-[4-6]]。減法作用於整個類別。例如 [\p{Ll}\p{Lu}-[\p{IsBasicLatin}]] 符合所有大寫和小寫 Unicode 字母,但任何 ASCII 字母除外。 \p{IsBasicLatin} 是從 \p{Ll}\p{Lu} 的組合中減去,而不是僅從 \p{Lu} 中減去。此正規表示式不會符合 abc

雖然你可以使用巢狀字元類別減法,但你無法連續減去兩個類別。若要從包含所有 Unicode 字母的類別中減去 ASCII 字元和希臘字元,請將 ASCII 和希臘字元組合成一個類別,並減去該類別,如下所示:[\p{L}-[\p{IsBasicLatin}\p{IsGreek}]]

否定優先於減法

字元類別 [^1234-[3456]] 既被否定又被減去。在所有支援字元類別減法的版本中,基本類別在被減去之前會先被否定。這個類別應解讀為「(非 1234)減去 3456」。因此,這個字元類別會匹配除了數字 1、2、3、4、5 和 6 之外的任何字元。

與其他正規表示式版本的符號相容性

請注意,像 [a-z-[aeiuo]] 這樣的正規表示式不會在大部分不支援字元類別減法的正規表示式版本中造成任何錯誤。但它也不會匹配你預期的內容。在大部分版本中,這個正規表示式包含一個字元類別,後接一個字面 ]。這個字元類別會匹配一個字元,它可能是 a-z 範圍內的字元、連字號、左括號或母音。由於 a-z 範圍和母音是多餘的,因此你可以將這個字元類別寫成 [a-z-[][-[a-z](在 Perl 中)。範圍後的連字號會被視為一個字面字元,就像在左括號後面的連字號一樣。在 XML、.NET 和 JGsoft 版本中也是如此。[a-z-_] 在這些版本中會匹配小寫字母、連字號或底線。

嚴格來說,這表示字元類別減法語法與 Perl 和大多數其他正規表示式版本不相容。但在實際應用中沒有差別。在字元類別範圍中使用非字母數字字元是非常不好的做法,因為它依賴於 ASCII 字元表中字元的順序。這會讓繼承你工作的程式設計師難以理解正規表示式。雖然 [A-[] 會在 Perl 中匹配任何大寫字母或左方括號,但當這個正規表示式寫成 [A-Z[] 時會更清楚。前一個正規表示式會在 XML、.NET 和 JGsoft 版本中造成錯誤,因為它們將 -[] 解釋為一個空的減去類別,留下一個不平衡的 [