教程 > 正则表达式 > 字符类 阅读:94

字符类交集

字符类交集


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仍将单个&号视为普通字符。  

查看笔记

扫码一下
查看教程更方便