《MRE》的4.2.4中有这样的一段话——To be clear, the standard quantifiers settle for something less than the maximum number of allowed matches if they have to, but they always attempt to match as many times as they can, up to that maximum allowed. The only time they settle for anything less than their maximum allowed is when matching too much ends up causing some later part of the regex to fail. A simple example is using \b\w+s\b to match words ending with an 's', such as 'regexes'. The \w+ alone is happy to match the entire word, but if it does, it leaves nothing for the s to match. To achieve the overall match, the \w+ must settle for matching only 'regexes', thereby allowing s\b (and thus the full regex) to match.
大概的意思如下:当目标文本中的一些子文本能被匹配的时候,量词被用来修饰这些被匹配的子文本以限制这些子文本被匹配的次数小于可允许的最大匹配次数,但是有一点,量词总是导致被匹配的子文本尽可能多的被匹配最大次数次。这里的最大次数是指当当前参与匹配的正则符号之后的正则部分因为当前参与匹配的正则符号过度匹配目标文本中的字符文本而导致目标文本中没有可匹配的字符文本的时候当前参与匹配的正则符号已经被匹配的次数。
这里的翻译可能有些拗口,但实在是表达不清楚了,看看《MRE》中给的例子吧——一目了然!!!!!!!!
假设用模式\b\w+s\b去匹配目标文本regexes。单独的一个\w+可以匹配整个目标文本regexes,但如果让\w+去匹配整个目标文本,那么正则中的符号s将没有对应的目标文本可匹配。所以,为了充分地全面匹配(the overall match),\w+只可以匹配目标文本中的子串regexe,而把最后的s留给正则中的符号s去匹配。
看到这里,俺上面的翻译应该还是比较正确滴——当\w+从r开始匹配,依次匹配了e、g、e、x和e后,当再匹配最后的那个s的时候就会产生过度匹配的现象。因为如果再让\w+去匹配最后的那个e,那么当RegEx中的字符s参与匹配的时候,目标文本中将不再又可用于匹配的字符文本。所以,为了让正则中的所有内容都可有效的使用,engine只允许\w+去匹配目标文本中的前6个字符,这里的6就是《MRE》中提到的那个“the only time”!
p.s.这里的模式中的符号\w+是metacharacter,所以这里讲述的是如何结束一个特殊字符的对比过程。想到前几天发的一个post《普通字符与特殊字符对应的Target text字符集+如何结束一个对特殊字符的对比过程》——为了获取由target text掌握的结束对比的权利,regex的设计者需要找到一种提前结束对比的方式,于是选择regex的结束字符作为结束条件,当在target text中发现与regex结束字符形式相等的字符的时候,就结束当前的一个对比,转入下一个对比。
所以,如何确定the only time,其实没有必要像《MRE》中说的那么麻烦,只要看看当前一个对比中是否有和regex结束字符等形式的字符,那么在这个字符之前进行的当前一个对比的所有一次对比数量就是the only time。