【正则表达式教程】字符类交集
字符类交集
Java,JGsoft V2和Ruby 1.9及更高版本支持字符类交集。它使匹配那种必须出现在两组字符中的任何单个字符变得容易。其语法为[class&&[intersect]]
。我们可以在相交的字符类中使用完整的字符类语法。
如果相交的类不需要负号,则Java和Ruby允许我们省略嵌套的方括号:[class&&intersect]
。
我们不能在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将此正则表达式解释为“(not 1234)and 3456”。因此,在Java和PowerGREP中,此类与[56]
相同,并且匹配数字5和6。在Ruby中,交集优先于求反。Ruby将[^1234&&3456]读为“ 非(1234和3456)”。因此,在Ruby中,此类与[^34]相同,后者匹配除数字3和4之外的所有内容。
如果要否定相交的右侧,则必须使用方括号。那些自动控制优先级。因此,Java,PowerGREP和Ruby都将[1234&&[^3456]]
解释为“ 1234 and(not 3456)”。因此,此正则表达式与[12]
相同。
与其他Regex的符号兼容性
在本教程中讨论的任何其他正则表达式类型中,“&”号在字符类中没有特殊含义。“&”号只是一个普通字符,重复使用它只会添加不必要的重复项。所有这些语言都将[1234&&3456]
视为与[&123456]
是相同的。
严格来说,这意味着字符类交集语法与大多数其他正则表达式风格不兼容。但是实际上没有什么区别,因为当我们只想添加字符“&”号时,在字符类中使用两个“&”号是没有意义的。 Java,Ruby和PowerGREP仍将单个&号视为普通字符。
本文转载自:迹忆客(https://www.jiyik.com)
以上是 【正则表达式教程】字符类交集 的全部内容, 来源链接: utcz.com/z/290359.html