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

字元類別交集

JavaJGsoft V2Ruby 1.9 及更新版本支援字元類別交集。這可以輕鬆配對必須存在於兩個字元組中的任何單一字元。語法為 [類別&&[交集]]。您可以在交集的字元類別中使用完整的字元類別語法。

如果交集類別不需要否定插入符號,則 Java 和 Ruby 允許您省略巢狀方括號:[類別&&交集]

您無法在 PowerGREP 中省略巢狀方括號。如果您這樣做,PowerGREP 會將連字符號解釋為字面意思。因此在 PowerGREP 中 [class&&intersect] 是僅包含字面意思的字元類別,就像 [clas&inter] 一樣。

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

字元類別 [\p{Nd}&&[\p{IsThai}]] 符合任何單一泰文數字。 [\p{IsThai}&&[\p{Nd}]] 完全執行相同的動作。

多個類別的交集

您可以多次交集同一個類別。[0-9&&[0-6&&[4-9]]][4-6] 相同,因為這些是交集所有三個部分中唯一出現的數字。在 Java 和 Ruby 中,您可以將相同的正規表示式寫成 [0-9&&[0-6]&&[4-9]][0-9&&[0-6&&4-9]][0-9&&0-6&&[4-9]],或僅 [0-9&&0-6&&4-9]。僅當交集的一部分被否定時,才需要嵌套方括號。

如果您沒有在交集的右半部分周圍使用方括號,那麼不會混淆字元類別的整個剩餘部分就是交集的右半部分。如果您確實使用方括號,您可以寫一些像 [0-9&&[12]56]。在 Ruby 中,這與 [0-9&&1256] 相同。但 Java 有錯誤,導致它將其視為 [0-9&&56],完全忽略嵌套括號。

PowerGREP 不允許在嵌套 ] 之後有任何東西。字元 56[0-9&&[12]56] 中是一個錯誤。這樣它們的含義就沒有歧義了。

您也不應將 && 放在正規表示式的開頭或結尾。Ruby 將 [0-9&&][&&0-9] 視為與空類別的交集,這完全不符合任何字元。Java 會忽略前導和尾隨的 && 運算子。PowerGREP 將它們視為文字縮寫符號。

否定類別中的交集

字元類別 [^1234&&[3456]] 同時被否定且相交。在 Java 和 PowerGREP 中,否定優先於交集。Java 和 PowerGREP 將此正規表示式讀取為「(非 1234)和 3456」。因此,在 Java 和 PowerGREP 中,此類別與 [56] 相同,並符合數字 5 和 6。在 Ruby 中,交集優先於否定。Ruby 將 [^1234&&3456] 讀取為「非(1234 和 3456)」。因此,在 Ruby 中,此類別與 [^34] 相同,符合除了數字 3 和 4 之外的任何內容。

如果您想要否定交集的右手邊,則必須使用方括號。它們會自動控制優先順序。因此,Java、PowerGREP 和 Ruby 都會將 [1234&&[^3456]] 讀取為「1234 和(非 3456)」。因此,此正規表示式與 [12] 相同。

與其他正規表示式風味的符號相容性

在本文討論的任何其他正規表示式風味中,字元類別中的縮寫符號沒有特殊含義。縮寫符號只是一個文字,重複它只會增加不必要的重複。所有這些風味都將 [1234&&3456] 視為與 [&123456] 相同。

嚴格來說,這表示字元類別交集語法與大多數其他正規表示法不符。但在實務上沒有差別,因為當你只想加入一個字面上的與號時,在字元類別中使用兩個與號沒有意義。Java、Ruby 和 PowerGREP 仍將單一與號視為字面。