【问题标题】:Regex Optional Groups?正则表达式可选组?
【发布时间】:2010-11-04 19:13:43
【问题描述】:

我似乎对我正在做的 preg_match 正则表达式感到困惑,因此我们将不胜感激。

我目前的正则表达式如下:

/<!--menu:start:\(([0-9])\,([0-9])\)-->(.*?)<!--menu:end-->/se

我希望输入数字和冒号,例如:(1,4) 可选,所以它会匹配:

<!--menu:start--><!--menu:end-->

<!--menu:start:(0,3)--><!--menu:end-->

【问题讨论】:

    标签: php regex preg-replace preg-match


    【解决方案1】:

    用不匹配的组括起来并将其设置为可选:(?:...)?

    /<!--menu:start(?::\(([0-9])\,([0-9])\))?-->(.*?)<!--menu:end-->/se
    

    【讨论】:

      【解决方案2】:

      像这样:

      /<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se
      

      我在你想成为可选的部分周围添加了一个非捕获组(?: ),然后在它后面加上一个问号:(?:&lt;optional content&gt;)?

      【讨论】:

      • 哈哈,关系不错……:)
      • 谢谢大家 :) 必须选择一个!
      • +1 到 Blixt 以获得更清晰的解释; (?...)? 有点令人困惑。
      • +1 用于使用\d 而不是0-9。未来证明了这个查询,当社会增加新的数字时,比如十一。
      【解决方案3】:

      这使用一个可选的非捕获组 -- (?: )? -- 来匹配您的可选部分,并且还使用 \d 而不是 [0-9] 来匹配数字:

      /<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se
      

      如果括号中的数字可以包含多个数字,请改用这个数字:

      /<!--menu:start(?::\((\d+),(\d+)\))?-->(.*?)<!--menu:end-->/se
      

      【讨论】:

      猜你喜欢
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多