【问题标题】:Regex plus vs star difference? [duplicate]正则表达式加与星号的区别? [复制]
【发布时间】:2012-01-24 09:45:41
【问题描述】:

有什么区别:

(.+?)

(.*?)

当我在我的 php preg_match regex 中使用它时?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    它们被称为量词。

    *0 个或多个前面的表达式

    + 1 个或多个前面的表达式

    默认情况下,量词是贪婪的,这意味着它匹配尽可能多的字符。

    在量词改变行为以使该量词“不贪婪”之后的?,意味着它将尽可能少地匹配。

    贪心/不贪心的例子

    例如关于字符串“abab

    a.*b 将匹配“abab”(preg_match_all 将返回一个匹配项,即“abab”)

    a.*?b 将仅匹配起始“ab”(preg_match_all 将返回两个匹配项,“ab”)

    您可以在线测试您的正则表达式,例如在正则表达式上,see the greedy example here

    【讨论】:

    • “懒惰”是“不贪婪”的更常见术语
    • 示例不正确。 (.+?)(.*?) 在正则表达式的不同位置(a(.+?)(.+?)ba(.+?)ba(.*?)(.*?)ba(.*?)b)表现不同。
    • 为什么 a.*b 不回馈“ab”?它不是说“在 a 和 b 之间有 0 个或多个字符的单词”,因此,ab 之间的字符为零并且可能是匹配项。为什么这是不正确的?
    • @HelloWorld,这与我上面解释的贪婪有关。 .* 将尽可能匹配。如果你想早点停下来,那么你必须让它变得不贪心.*?
    【解决方案2】:

    第一个 (+) 是一个或多个字符。第二个 (*) 是零个或多个字符。两者都是非贪婪的 (?) 并且匹配任何东西 (.)。

    【讨论】:

    • 这取决于是否设置了 s 修饰符。
    【解决方案3】:

    + 至少匹配一个字符

    * 匹配任意数量(包括 0)的字符

    ? 表示惰性表达式,因此它会匹配尽可能少的字符。

    【讨论】:

      【解决方案4】:

      + 匹配上述模式的一个或多个 实例。 * 匹配前面模式的零个或多个实例。

      所以基本上,如果您使用+,则必须至少有一个模式实例,如果您使用*,如果没有实例,它仍然会匹配。

      【讨论】:

        【解决方案5】:

        考虑下面是要匹配的字符串。

        ab
        

        模式(ab.*) 将返回匹配捕获组,结果为ab

        而模式(ab.+) 将不匹配并且不返回任何内容。

        但是如果你把字符串改成following,它会返回aba for pattern (ab.+)

        aba
        

        【讨论】:

          【解决方案6】:

          在 RegEx 中,{i,f} 表示“在 if 之间匹配”。我们来看看下面的例子:

          • {3,7} 表示 3 到 7 个匹配项
          • {,10} 表示最多 10 个匹配,没有下限(即下限为 0)
          • {3,} 表示至少 3 个匹配且没有上限(即上限为无穷大)
          • {,} 表示匹配数没有上限或下限(即下限为0,上限为无穷大)
          • {5} 正好是 4

          大多数好的语言都包含缩写,RegEx 也是如此:

          • +{1,} 的简写
          • *{,} 的简写
          • ?{,1} 的简写

          这意味着+ 需要至少 1 个匹配项,而 * 接受任意数量的匹配项或根本不接受匹配项,? 接受不超过 1 个匹配项或零个匹配项。

          来源:Codecademy.com

          【讨论】:

            【解决方案7】:

            + 是最小的一,* 也可以是零。

            【讨论】:

            • "+ is minimal one"这句话是什么意思?
            • 我发现这些“定义”具有误导性。
            【解决方案8】:

            星号与加号非常相似,唯一的区别是加号匹配前面字符/组的 1 个或多个,而星号匹配 0 个或多个。

            【讨论】:

              【解决方案9】:

              我认为前面的答案未能突出一个简单的例子:

              例如我们有一个数组:

              numbers = [5, 15]
              

              以下正则表达式 ^[0-9]+ 仅匹配:15。 但是,^[0-9]* 匹配 5 and 15。不同之处在于+ 运算符需要至少一个 duplicate 前面的正则表达式

              【讨论】:

              • 嗯,什么?!?为什么这个答案完全被忽略了?这是完全不正确的。这两种模式肯定会匹配字符串515
              猜你喜欢
              • 2022-11-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-07
              相关资源
              最近更新 更多