快速入门
教程
工具和语言
示例
参考
书评
正则表达式教程
简介
目录
特殊字符
不可打印字符
正则表达式引擎内部
字符类
字符类减法
字符类交集
简写字符类
锚点
单词边界
交替
可选项
重复
分组和捕获
反向引用
反向引用,第 2 部分
命名组
相对反向引用
分支重置组
自由间距和注释
Unicode
模式修饰符
原子分组
占有量词
前瞻和后顾
环视,第 2 部分
将文本保留在匹配之外
条件
平衡组
递归
子例程
无限递归
递归和量词
递归和捕获
递归和反向引用
递归和回溯
POSIX 方括号表达式
零长度匹配
继续匹配
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 提要和博客
RegexBuddy—Better than a regular expression tutorial!

字符类交集

JavaJGsoft V2 以及 Ruby 1.9 及更高版本支持字符类交集。它可以轻松匹配必须存在于两组字符中的任何单个字符。其语法为 [&&[相交]]。您可以在相交的字符类中使用完整的字符类语法。

如果相交的类不需要否定脱字符,则 Java 和 Ruby 允许您省略嵌套方括号:[&&相交]

您不能在 PowerGREP 中省略嵌套方括号。如果您这样做,PowerGREP 会将和号解释为文本。因此,在 PowerGREP 中,[类&&相交] 是一个只包含文本的字符类,就像 [类&相交] 一样。

字符类 [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 视为文本。