正则表达式入门手册

非贪婪匹配 —— "?"

预计阅读时间0 分钟 162 views

我们可以看到上面的”*”和表格里面的”+”都是可以匹配后面的多个字符,那如果我们只想尽可能少的匹配,或者说只想匹配到符合要求的第一个呢?

这个时候我们就可以用问号来限制匹配数量。

我们举个例子说明一下,我们现在只想匹配所有书括号里面的信息。

示例一:
正则表达式:《.*》
片段为:《杀死一只知更鸟》,《传习录》,《西游记》这几本书都挺好看的。
匹配结果:《杀死一只知更鸟》,《传习录》,《西游记》

示例二:
正则表达式:《.*?》
片段为:《杀死一只知更鸟》,《传习录》,《西游记》这几本书都挺好看的。
匹配结果:《杀死一只知更鸟》

示例三:
正则表达式:《.*?》
片段为:《杀死一只知更鸟》,《传习录》,《西游记》这几本书都挺好看的。
全局匹配结果:
    结果0:《杀死一只知更鸟》
    结果1:《传习录》
    结果2:《西游记》

我们可以看到,示例一中没有加”?”,所以会默认开启贪婪模式,比如当遇到”《杀死一只知更鸟》”这个到时候,其实就已经符合正则表达式的要求了,但是系统会继续往后尝试,会获取符合要求,最长的字符串,这个时候就会一直匹配到最后一个书括号,也就是有了”《杀死一只知更鸟》,《传习录》,《西游记》”这样一个最长并且符合要求的字符串了。

但是如果加了”?”,我们可以看到他会跟贪婪模式相反,也就是会去获取符合要求的,并且最短的字符串,所以获取到”《杀死一只知更鸟》”就结束了。

如果开启全局匹配,也就是匹配多次,那就可以把所有的书名都作为单独的结果匹配下来。

这就是非贪婪模式的作用和实例。

但是你有没有发现上面的一个弊端,就是要么全都要,要么只要最短,难道我就不能控制匹配的数量?

Leave a Comment

分享此文档

非贪婪匹配 —— "?"

或复制链接

内容