我们可以使用?
把它之前的token标记为可选的。例如colou?r
可以匹配 colour 或者 color。?
问号在这里是一种量词。
我们可以使用匹配组把多个token标记为非必须的。例如Nov(ember)?
可以匹配 Nov 和 November。
你可以在一个表达式中使用多个问号,这样可以形成更多种不同的组合。例如Feb(ruary)? 23(rd)?
可以匹配February 23rd, February 23, Feb 23rd 和 Feb 23
问号是本教程中首个贪婪的元字符。正则引擎遇到问号标记的时候会有两种选择:1)匹配当前的可选项。2)不匹配当前的可选项。引擎总是会先尝试匹配这个可选项,如果可选项匹配不成功,引擎会忽略这个可选项继续下一个token的匹配。
例如用Feb 23(rd)?
匹配 Today is Feb 23rd, 2003 ,得出的结果是 Feb 23rd 而不是Feb 23。你可以通过添加双问号来关闭贪婪模式。
有关其它的重复量词以及贪婪模式我们会在以后的章节中展开。
让我们看一下colou?r
是如何匹配 The colonel likes the color green 的。
匹配的第一个token是c
,第一次匹配成功的字符是 colonel 中的c。引擎继续向前匹配,接下来的olo三个字符都匹配成功了。接下里匹配的token是u
,匹配的字符是 n ,因为这是一个字面量字符,所以匹配没有成功。但是此时引擎并没有立即回溯,因为tokenu
后面是一个问号,u
匹配失败是可以接受的。接下来引擎继续匹配下一个tokenr
,字面量r
和字符n也不能匹配上。此时引擎确认表达式无法从 colonel 的第一个字符 c 开始匹配。下一步引擎将回溯到 colonel 的第二字符 o 重新匹配整个表达式。
接下来的一系列字符都无法和首个tokenc
匹配,直到 color 的第一个字符 c ,并且接下的olo
三个token都匹配成功了。接下来引擎尝试用tokenu
和字符 r 匹配,没有匹配成功。和之前一样引擎认为tokenu
匹配失败是可以接受的。接下来引擎将tokenr
和字符 r 匹配,这一次匹配成功了。此时整个表达式都匹配成功了。
如果文章出现错误,请给我提Issues - - Github地址