匹配原理

从概念上讲,当你使用exectest时,正则表达式引擎在你的字符串中寻找匹配,通过首先从字符串的开头匹配表达式,然后从第二个字符匹配表达式,直到它找到匹配或达到字符串的末尾。 它会返回找到的第一个匹配,或者根本找不到任何匹配。

为了进行实际的匹配,引擎会像处理流程图一样处理正则表达式。 这是上例中用于家畜表达式的图表:

匹配原理 - 图1

如果我们可以找到一条从图表左侧通往图表右侧的路径,则可以说“表达式产生了匹配”。我们保存在字符串中的当前位置,每移动通过一个盒子,就验证当前位置之后的部分字符串是否与该盒子匹配。

因此,如果我们尝试从位置 4 匹配"the 3 pigs",大致会以如下的过程通过流程图:

  • 在位置 4,有一个单词边界,因此我们通过第一个盒子。

  • 依然在位置 4,我们找到一个数字,因此我们通过第二个盒子。

  • 在位置 5,有一条路径循环回到第二个盒子(数字)之前,而另一条路径则移动到下一个盒子(单个空格字符)。由于这里是一个空格,而非数字,因此我们必须选择第二条路径。

  • 我们目前在位置 6(pig的起始位置),而表中有三路分支。这里看不到"cow""chicken",但我们看到了"pig",因此选择"pig"这条分支。

  • 在位置 9(三路分支之后),有一条路径跳过了s这个盒子,直接到达最后的单词边界,另一条路径则匹配s。这里有一个s字符,而非单词边界,因此我们通过s这个盒子。

  • 我们在位置 10(字符串结尾),只能匹配单词边界。而字符串结尾可以看成一个单词边界,因此我们通过最后一个盒子,成功匹配字符串。