【问题标题】:PCRE: Difference between .* and .*? in regular expressionsPCRE:.* 和 .* 之间的区别?在正则表达式中
【发布时间】:2013-11-22 23:23:37
【问题描述】:

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

谁能解释一下确切的区别并给我看一个简短的例子?

谢谢

【问题讨论】:

标签: pcre


【解决方案1】:

我喜欢馄饨,因为它们是美味的小吃

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

如果您要使用非贪婪修饰符 ?,例如 i.*?s,那么您将得到以下结果:

我喜欢放荡

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

【讨论】:

    【解决方案2】:

    * 是一个贪婪匹配 - 换句话说,匹配零到多次,尽可能多次。 *? 是一个最小匹配 - 换句话说,匹配零到多次,尽可能少的匹配模式的其余部分才有意义。同样,+?+ 的最小匹配版本。

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

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2012-06-01
      • 2013-09-18
      • 2016-11-18
      • 2012-02-22
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      相关资源
      最近更新 更多