15.2.2 元字符
到目前为止,读者已经了解到,正则表达式是定义了字符串匹配规则的字符串,该字符串是由普通字符(例如字符a到z)以及特殊字符组成的文字模式。普通字符通常是包括所有的大写和小写字母字符、所有数字、所有标点符号以及一些符号。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。例如,正则表达式Mac*所表达的含义是,所有包含Mac并且Mac后跟零个或多个字符的字符串。Mack、Macintosh以及Mac本身都是符合这个正则表达式所定的规则的。Mac*中的星号*有其特殊含义,它表示一个或多个字符。
类似星号*这样有特殊含义的字符在正则表达式中还有很多,这样的字符叫做元字符。正则表达式中的元字符有:^$[]\.|()?*+。这些字符被保留下来,有其特殊用途。下面就分别介绍这些元字符的用途。
❑元字符:^,用来匹配以指定字符(或字符串)开头的字符串。例如,模式^hell可以匹配hello,hell等,但其不匹配holla。
❑元字符:美元符号$,用来匹配以指定字符(或字符串)结尾的字符串。例如,ow$可以匹配low、fellow等,这些字符串均以ow结尾。
❑元字符:英文句点.,用来匹配除\n之外的任何单个字符。例如,要找出三个字母的单词,而且这些单词必须以字母“b”开头,以“s”字母结束。通常可以使用这个通配符——英文句点符号“.”。这样,完整的模式就是“b.s”,这就是一个正则表达式,它可以匹配三个字母的单词,这些单词可以是“bes”、“bis”、“bos”和“bus”。事实上,这个正则表达式还可以匹配“b3s”、“b#s”甚至“b s”,还有其他许多无实际意义的组合。又如,模式^.5$匹配以数字5结尾和以其他非换行字符开头的字符串。模式.可以匹配任何字符串,除了空串和只包括一个换行的字符串。
❑元字符:方括号[],为了解决句点符号匹配范围过于宽泛的问题,可以方括号“[]”来指定匹配范围,可以在方括号内指定有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“b[eiou]s”只匹配“bes”、“bis”、“bos”和“bus”。但“bees”不匹配,因为在方括号之内只能匹配单个字符。例如,[a-z]用来匹配所有小写字母,但只能匹配一个字母。注意,通常用符号-连接匹配范围的首尾。
❑元字符:或操作符号|,可以完成在两项或多项之间选择一个进行匹配。对于上述的例子,如果还想匹配“boos”,那么以使用“|”操作符,“|”操作符的基本意义就是“或”运算。所以正则表达式“b(a|e|i|o|oo)s”可以匹配“boos”。特别注意,这里不能使用方括号,因为方括号只允许匹配单个字符。这里必须使用圆括号“()”。圆括号还可以用来分组,后面的小节会有介绍。如果希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,就可以使用元字符\。
❑元字符:\,用来转义一个字符。对于一些特殊的符号的匹配,如元字符本身和空格、制表符等,需要用到转义,所有的转义序列都用左斜杠\打头。例如,要在正则表达式中匹配元字符$,就需要使用\$,匹配元字符\就要使用\\。关于转义字符更多的内容,将在15.2.3小节介绍。
❑元字符:(),标记一个子表达式的开始和结束位置,即括住一个表达式。
以上介绍的元字符基本可以看作是对字符(或字符串)位置的匹配,下面介绍和匹配次数有关的一些元字符。这些元字符用来确定紧靠该符号左边的符号出现的次数。注意,这里强调了“紧靠左边”这一原则。
注意 *、+和?只对紧挨它的前面那个字符起作用。还有其他几种表示法可以限定匹配次数,这些内容将在15.2.5小节介绍。
❑元字符:*,匹配其左边(即前面)的子表达式0次或多次。例如,pe*匹配perl、peel、pet、port等,因为这些字符串都符合(即匹配)在字母p后连续出现0个或多个字母e。
❑元字符:+,匹配其左边(即前面)的子表达式1次或多次,注意,与*不同,+前的字符至少要出现1次,例如,co+匹配come、code、cool、co等,这些字符串都匹配在字母c后至少出现1个或多个字母o。
❑元字符:?,匹配其左边(即前面)的子表达式0次或1次。