【问题标题】:Problem (un-)greedy RegExp问题(内)贪婪的正则表达式
【发布时间】:2011-01-22 00:31:33
【问题描述】:

考虑以下字符串:

1: cccbbb

2: cccaaabbb

我希望得到这样的匹配:

1: Array
(
    [1] => 
    [2] => bbb
)

2: Array
(
    [1] => aaa
    [2] => bbb
)

如何在一个 RegExp 中同时匹配两者?
这是我的尝试:

#(aaa)?(.*)$#

我尝试了许多贪婪和不贪婪修改的变体,但都没有成功。只要我添加“?” [2] 中的所有内容都匹配。使 [2] 变得不贪婪并没有帮助。

如果我省略“ccc”,我的 RegExp 会按预期工作,但我必须在开头允许其他字符...

【问题讨论】:

  • 你能比.*更好地指定第二部分吗?也许是b*
  • 可惜不是,我只知道第一个aaa应该匹配在[1]
  • 那么aaa之前的部分呢?
  • 也可以不指定,当然只是不包含aaa。我也尝试了匹配 ccc 的 RegExp 的其他变体,但我没有任何运气。
  • 你能描述一下ccc部分吗?如果不能,在第一种情况下如何只得到 bbb 而没有 ccc?

标签: php regex parsing string


【解决方案1】:

这样做:

$sPattern = "/(aaa?|)(bbb)/";

这很好用。

【讨论】:

    【解决方案2】:

    感谢大家集思广益!我终于能够弄清楚一些有效的方法:

    ^(?:([^a]*)(aaa))?(.*)$
    

    【讨论】:

    • 但它并没有达到你想要的效果。在您的示例 1 中,\1 将包含 cccbbb;在您的示例 2 中,\1 包含 ccc\2 包含 aaa\3 包含 bbb。你真的想做什么?
    • 不行,在例子1中\3´ will contain cccbbb, with this RegExp. \1`只能和\2一起出现,试试看。
    • 这将如何与bbb 匹配cccbbb
    【解决方案3】:

    这将匹配组,但它不是很灵活,您可以详细说明您需要做什么。一次抓取三个字符并对其进行评估可能会容易得多。

    我还在 poweshell 中对此进行了测试,它与正则表达式的风格略有不同。

    (a{3,3})*(b{3,3})

    【讨论】:

      【解决方案4】:

      这是一种非正则表达式方式。如果找到,则搜索并拆分“aaa”,然后将“aaa”右侧的其余部分存储到数组中。

      $str="cccaaabbb";
      if (strpos($str,"aaa")!==FALSE){
         $array[]="aaa";
         $s = explode("aaa",$str);
         $array[]=end($s);
      }
      print_r($array);
      

      输出

      $ php test.php
      Array
      (
          [0] => aaa
          [1] => bbb
      )
      

      至于 [1],取决于您在找不到“aaa”时的标准,它可以像使用 strpos() 从字符 4 开始获取子字符串一样简单。

      【讨论】:

        【解决方案5】:
        /(aaa)?((.)\3*)$/
        

        不过会有一个额外的 [3]。我认为这不是问题。

        【讨论】:

        • 这似乎有效!您介意解释一下(.)\3* 部分的作用吗?
        • @samy: (.) 匹配任何字符(\n 除外)。这里有 3 个捕获括号,(.) 是第 3 个。 \3* 部分表示零个或多个“东西”,与第三场比赛相同。所以基本上(.)\3* 表示一个或多个任意但相同的字符。
        • 我刚刚发现这也不是。 bbb 可以包含不同的字符。 bbb 可能不是一个好例子。
        猜你喜欢
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多