重要提示:字符类中和字符类外的规则有时不同,一些字符在字符类中是元字符,在字符类外是普通字符。一些字符正好相反。还有一些字符在字符类中和字符类外都是元字符,这要视情况而定!
比如,.表示匹配任意一个字符,而[.]表示匹配一个全角句号。这不是一回事!
字符类的范围在字符集中,你可以通过使用短横线来表示匹配字母或数字的范围。
[b-f]与[b,c,d,e,f]相同,都是匹配一个字符”b”或”c”或”d”或”e”或”f”
[A-Z]与[ABCDEFGHIJKLMNOPQRSTUVWXYZ]相同,都是匹配任意一个大写字母。
[1-9]与[123456789]相同,都是匹配任意一个非零数字。
练习使用目前我们已经讲解的正则表达式相关知识,在字典中匹配找到含有最多连续元音的单词,同时找到含有最多连续辅音的单词。
答案[aeiou][aeiou][aeiou][aeiou][aeiou][aeiou] 这样的正则表达式,可以匹配连续含有六个元音的单词,比如 euouae 和 euouaes。
同样的,恐怖的正则表达式[bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz] 可以找到连续含有十个辅音的单词sulphhydryls.
下文中,我们会讲解,怎样有效缩短这样的正则表达式长度。
在字符类之外,短横线没有特殊含义。正则表达式a-z,表示匹配字符串“以a开头,然后是一个短横线,以z结尾”。
范围和单独的字符可能在一个字符类中同时出现:
[0-9.,]表明匹配一个数字,或者一个全角句号,或者一个逗号
[0-9a-fA-F]意味着匹配一个十六进制数
[a-zA-Z0-9\-]意味着匹配一个字母、数字或者一个短横线
练习使用已经介绍过的正则表达式知识,匹配YYYY-MM-DD格式的日期。
答案[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].
同样的,下文中,我们会介绍怎样有效减少这样的正则表达式长度。
虽然你可以尝试在正则表达式中使用一些非字母或数字作为范围的最后一个符号,比如abc[!-/]def,但是这并不是在每种实现中都合法。即使这样的语法是合法的,这样的语义也是模糊的。最好不要这样使用。
同时,你必须谨慎选择范围的边界值。即使[A-z]在你使用的实现中,是合法的,也可能会产生无法预料的运行结果。(注意,在z到a之间,是有字符存在的)
注意:范围的字符值代表的是字符而已,并不能代表数值范围,比如[1-31]表示匹配一个数字,是1或者2或者3,而不是匹配一个数值在1到31之间的数。
字符类的反义你可以在字符类的起始位放一个反义符。
[^a]表示匹配任何不是“a”的字符
[^a-zA-Z0-9]表示匹配任何不是字母也不是数字的字符
[\^abc]匹配一个为“^”或者a或者b或者c的字符
[^\^]表示匹配任何不为“^”的字符
练习在字典中,找到一个不满足“在e之前有i,但是没有c”的例子。
答案cie和[^c]ei都要可以找到很多这样的例子,比如ancient,science,viel,weigh
转义字符类\d这个正则表达式与[0-9]作用相同,都是匹配任何一个数字。(要匹配\d,应该使用正则表达式\\d)
\w与[0-9A-Za-z]相同,都表示匹配一个数字或字母字符
\s意味着匹配一个空字符(空格,制表符,回车或者换行)
另外
\D与[^0-9]相同,表示匹配一个非数字字符。
\W与[^0-9A-Za-z]相同,表示匹配一个非数字同时不是字母的字符。
\S表示匹配一个非空字符。
这些是你必须掌握的字符。你可能已经注意到了,一个全角句号“.”也是一个字符类,可以匹配任意一个字符。
很多正则表达式的实现中,提供了更多的字符类,或者是标志位在ASCII码的基础上,扩展现有的字符类。