PCRE:。*和。*之间的区别?在正则表达式中

时间:2013-11-22 23:23:37

标签: pcre

我想知道,为什么.*.*?在PCRE正则表达式中不一样(例如在PHP的preg_match()中.Dot .是任何可能字符的符号,{ {1}}是0到无穷大重复的符号。为什么符号*表示0到1的重复?但是它显然不相同,因为?不能与{{1}互换但是,我不能看到逻辑差异,我必须总是尝试在某些情况下哪些有效,哪些无效。我认为.*?应该与任何东西都不匹配,.*是多余的,因为它指定.*可以是0或1次 - 但是零次是空字符串,空字符串也应该由?匹配。

任何人都可以解释一下我的确切差异是什么,并向我展示简短的例子吗?

由于

2 个答案:

答案 0 :(得分:5)

  

我爱肆意,因为它们是美味的小吃

在上面的字符串中,假设您尝试将其与i.*s匹配。结果将是整个字符串,因为它被称为greedy match。它匹配从i的第一个实例到s的最后一个实例。

如果您使用非贪婪修饰符?,例如i.*?s,则会产生以下结果:

  

我爱肆意

这是因为非贪婪?修饰符仅匹配s的第一个实例。

答案 1 :(得分:0)

*贪婪的匹配 - 换句话说,匹配零到多次,尽可能多次。 *?最小匹配 - 换句话说,匹配零到多次,尽可能少的时间使其余模式有意义。同样,+?+的最低匹配版本。

考虑字符串this is "quoted" and this is "also quoted"。正则表达式".*"将匹配一个结果"quoted" and this is "also quoted"; ".*?"会匹配两次,"quoted""also quoted"