关于"匹配优先"和"忽略优先"

为了更好的理解“匹配优先”和“忽略优先”我们可以这样定义:
“匹配优先”可以理解为“贪婪匹配”或“非懒惰匹配”;
“忽略优先”可以理解为“非贪婪匹配”或“懒惰匹配”;


强调一点:表达式cat不是匹配以cat开头的字串。而是匹配一个c,再匹配一个a,最后匹配一个t。Jeffrey E.F.Friedl这样告诉我们。

一、匹配优先
字  串:     
<B>Billions</B> and <B>Zillions</B> of

表达式:     
<B>.*</B>

结  果:      
<B>Billions</B> and <B>Zillions</B>

描  述:
         匹配优先时.*只从自身出发,匹配尽可能多的内容,只有在全局匹配需要的情况下才会“被迫”交还一些字符。
     在最开始的<B>匹配之后,.*能够匹配任何字符,所以它会一直匹配到字符串的末尾。
     为了让最后的</B>能够匹配,.*会不断交还字符(或者,更确切的说,是正则引擎强迫它回退),顺序:‘>’、‘B’、‘/’、‘<’直到满足‘<’匹配为止。


二、忽略优先
字  串:     
<B>Billions</B> and <B>Zillions</B> of

表达式:     
<B>.*?</B>

结  果:      
<B>Billions</B>
<B>Zillions</B>
描  述:
        开始的<B>匹配之后,.*?首先决定不需要匹配任何字符,因为它是忽略优先的。
    于是,控制权交给后面的‘<’符号:
    此时‘<’无法匹配‘B’,所以控制权交还给.*?则成功匹配‘B’。
    此时.*?又必须选择,是继续尝试匹配,还是忽略?因为它是忽略优先的,会首先选择忽略。
    接下来‘<’仍然无法匹配‘i’,所以控制权又再一次的交由.*?成功匹配后再交由‘<’,……这样继续直到‘<’匹配成功。
    此时位置为<B>后第一次出现</B>的位置。
    这样就出现了两个成功匹配结果<B>Billions</B>和<B>Zillions</B>

你可能感兴趣的:(正则表达式,F#)