Skip to content

Latest commit

 

History

History
27 lines (16 loc) · 2.41 KB

011-非必须项.md

File metadata and controls

27 lines (16 loc) · 2.41 KB

11.1 非必选项

我们可以使用?把它之前的token标记为可选的。例如colou?r可以匹配 colour 或者 color。?问号在这里是一种量词。

我们可以使用匹配组把多个token标记为非必须的。例如Nov(ember)?可以匹配 Nov 和 November。

你可以在一个表达式中使用多个问号,这样可以形成更多种不同的组合。例如Feb(ruary)? 23(rd)? 可以匹配February 23rd, February 23, Feb 23rd 和 Feb 23

11.2 重要概念:贪婪匹配

问号是本教程中首个贪婪的元字符。正则引擎遇到问号标记的时候会有两种选择:1)匹配当前的可选项。2)不匹配当前的可选项。引擎总是会先尝试匹配这个可选项,如果可选项匹配不成功,引擎会忽略这个可选项继续下一个token的匹配。

例如用Feb 23(rd)?匹配 Today is Feb 23rd, 2003 ,得出的结果是 Feb 23rd 而不是Feb 23。你可以通过添加双问号来关闭贪婪模式。

有关其它的重复量词以及贪婪模式我们会在以后的章节中展开。

11.3 非必选项的原理

让我们看一下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地址

原文