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