匹配直接量字符是非常直观的,特别是当你只想查找与正则表达式模式中包含的直接量字符匹配一次的字符时。
那么,在此基础上我们可以想象一下如果要匹配单个直接量字符出现零次或一次该怎么做?对此,多数正则表达式实现都使用问号(?)字符来表示前面的字符块是可选的;如果你想匹配字符块零次和多次,则使用星号(*)字符来表示;如果想匹配字符块一次和多次,则使用加号(+)字符来表示;
下面将仔细介绍 ?、* 和 + 字符的用法。
在正则表达式中,? 符号表示匹配前面字符块零次和一次。例如:
colou?r
上面的模式,当正则表达式引擎恰好搜索到 color 中的 c 之前的位置时,它会尝试匹配小写的 c。这个匹配成功后,它会尝试匹配小写的 o,这次也成功了。然后,它又尝试依次匹配小写的 l 和 o,同样也成功了。此时,正则表达式引擎尝试匹配模式 u?,它的含义是匹配 0 个或 1 个小写的 u。最后匹配小写的 r,如果也匹配成功了,则整个模式匹配成功。它将匹配 color 和 colour 两个字符串。
正则表达式中,* 操作符表示相关的模式出现零次和多次。换句话说,一个或一组字符是可选的,但也可能会出现多次。而且,* 限定符应该匹配块出现零次或一次的情况,进而,两次、三次,甚至十次都应该匹配。所以从原则上说,不论出现多少次也都会匹配。例如:
ABC[0-9]*
上面模式将匹配一个大写的 A。如果匹配成功,尝试匹配一个大写的 B。如果匹配成功,尝试匹配一个大写的 C。如果全部三个大写字符都匹配,尝试匹配零个和多个数字。它可以匹配如下字块:
ABC ABC123 ABC12 ABC889 ABC34
注意:上面模式中的 [0-9] 表示匹配数字 0 到 9。
很多情况下,我们只能确定一个或一组字符至少存在一次,但也不排除该字符出现多次的可能性。而 + 操作符就是为这种情况设计的。该操作符的含义是 “匹配一次或多次前面的字符块或组”。例如:
ABC[0-9]+
上面模式将匹配一个大写的 A。如果匹配成功,尝试匹配一个大写的 B。如果匹配成功,尝试匹配一个大写的 C。如果全部三个大写字符都匹配,尝试匹配一个或多个数字。