上一节了解正则表达式的结构中我们初步了解了元字符,现在我们开始正式学习元字符,我会用几个例子来介绍它们。
行的起始和结束
首先要理解的是元字符就是脱字符号 ^
和美元符号 $
,在检查一行文本时,^
代表一行的开始,$
代表结束。
来看个小实例,如果需要统计一篇关于宠物文章里面 dog 出现的次数,要如何写这个正则呢?
/dog/
,这样对不对?但是如果要统计每一段最开头的 dog 呢?应该这样 /^dog/
,是不是啊?如果要统计最后的就应该这样了 /dog$/
。
在这个正则中 /^dog/
中,我们第一反应就是以 dog 开头的本文,但实际上我们应该这样理解,以字母 d 开头接下来是 og 的文本。这两种理解方式结果并没有差异,但按照字符来解读更容易理解正则表达式中的逻辑。
字符组
匹配若干字符之一
继续,什么叫匹配若干字符之一。如果我要搜索一个单词 helay,但是我不确定它是否写作,就可以使用 正则表达式结构体 (construct)/[……]/
。它允许使用者列出这个地方期望匹配的字符,通常被称作 字符组 (character class)。/[e]/
匹配字符 e,/[a]/
匹配字符 a,/[ea]/
能匹配字符 e 或者 a。所以在上面的情景中,可以写这样的正则 /h[ea]lay/
。
注意,正则表达式默认是区分大小写的,/helay/
是不能匹配到 Helay 的,现阶段,如果我们要匹配 Helay 怎么办呢?有了字符组,可以这样写,/[hH]elay/
。
在字符组内部,可以列举任意多个字符。例如我们要匹配 HTML TAG 标签中的 H 标签,/\/
,这个正则可以用来匹配这个正则可以用来匹配 <H1>
、<H2>
、<h3>
等。
在字符组内部, 字符组元字符 "-"
(连字符)表示一个范围:/H[1-6]/
和 /H[123456]/
是完全一样的。/[0-9]/
和 /[a-z]/
是常用的匹配数字和小写字母的简便方式。同时多重范围也是允许的。例如 /[012345abcdefABCDEF]/
完全可以写成 /[0-5a-fA-F]/
(或者写成 /[a-f0-5A-F]/
,顺序无所谓)。
注意了啊!只有在字符组内部,连字符号才是元字符,否则它就是普通的连字符号。其实连字符号在字符组内部也不一定是元字符。如果连字符号出现在了字符组的开头,它表示就是一个普通的字符,而不是一个范围。同样的道理,问号和点号通常被当作元字符处理,但是在字符组中则不是如此(示例:/[0-9A-Z_!.?]/
,这个正则中,真正的特殊字符就只有那两个连字符)。
排除型字符组
用 /[^……]/
取代 /[……]/
,这个字符组就会匹配任何未列出的字符。例如:[^1-6]
匹配除了 1 到 6 的任何字符。这个字符组开头的 ^
表示“排除”,所以这里列出了不希望匹配的字符。
注意了啊!排除型字符组表示“匹配一个为列出的字符”,而不是“不要匹配列出的字符”。这两种说法看起来一样,但是有细微的差异。有一种简单的理解排除型字符组的方法,就是把它们看作普通的字符组,里面包含的是除了“排除型字符组中所有字符”以外的字符。