精通正则表达式之匹配优先与忽略优先
一、综述:
1、知识储备:
匹配优先:尽可能多的匹配
忽略优先:尽可能少的匹配
忽略优先只需要在原本的匹配优先量词后加一个问号即可,即在:*、+、?一类后缀元字符后加入?即可
要注意的是,DFA不支持忽略优先。
2、情景描述:
最近在工作当中在使用一个正则表达式的时候遇到了一个问题,用如下正则表达式匹配一个字符串的时候,没有匹配出我想要的效果。
匹配优先正则表达式:%\{.*\}
忽略优先正则表达式:%\{.*?\}
字符串:%{hhhh},%{321666}
二、匹配优先:
在notepad++里面匹配出来的效果如下:
只匹配到了一个,通过查询发现是把%{hhhh},%{321666}整体当成了一个匹配成功的结果:
三、忽略优先:
这不是我想要的结果,我希望能把%{hhhh}和%{321666}当成两个结果匹配出来,于是此处改用了忽略优先匹配,忽略优先只需要在原本的匹配优先量词后加一个问号即可,然后此处的正则表达式变为了:
%\{.*?\}
然后检索的结果变成:
成功检索到了两个,然后检查检索的结果:
成功!
三、总结:
之前在看正则表达式的书的时候,对于匹配优先与忽略优先进行过阅读与理解,但是在工作当中实际上用得不多,这次遇到了这个问题也就想了起来,便再次进行一次记录,此处也简单再对造成这种结果的原因进行一次梳理。
匹配优先是在通配符匹配的过程中优先当成匹配处理,所以此处的%\{.*\}在匹配到 %{hhhh},%{321666} 这个字符当中的h},%处的 } 字符时,优先认为了.*是可以匹配该字符的,这也是正确的,因为 . 字符的确可以匹配任意字符,所以此处直到匹配到字符串的末尾时才判断了已匹配的字符串可匹配。
忽略优先是在通过符匹配的过程中优先当作不匹配,先匹配通配符后的明确的字符,所以此处的%\{.*?\}在匹配到 %{hhhh},%{321666} 这个字符当中的h},%处的 } 字符时,和匹配每一个字符一样优先进行了忽略,所以此处就判断出了是一个可以匹配的短字符串。
总结完毕,go on!