【问题标题】:regular expression match ending III or II or I (php) [duplicate]正则表达式匹配结尾 III 或 II 或 I (php) [重复]
【发布时间】:2019-12-15 06:48:30
【问题描述】:

我尝试使用正则表达式 (php) 来匹配结尾的罗马数字。为简单起见,请考虑以下示例:

$str="Olympic III";
preg_match("#^(.*)(III|II|I)$#",$str,$rep);
print_r($rep);

这只会匹配一个“I”。正确的答案是我使用不贪婪的“U”修饰符。但为什么?正则表达式不使用我提供的顺序吗(在尝试“II”或“I”之前先尝试“III”)?

【问题讨论】:

  • 试试/I{1,3}/

标签: php regex preg-match


【解决方案1】:

让我们先了解\U在做什么。默认情况下,它使量词(在您的情况下,第一个捕获组中的 *)变得惰性。

您的正则表达式等同于没有 Ungreedy 标志的 (.*?)(III|II|I),正如您所期望的那样,matches

使用(.*)(III|II|I),您实际上要求正则表达式引擎贪婪地使用量词,即尽可能长时间地匹配任何内容。由于您的交替允许接受IIIIII,因此第一个捕获组因为它贪婪地行动,所以消耗最多,并将最小的部分留给包含交替的第二组。

【讨论】:

    【解决方案2】:

    .* 匹配 (III|II|I) 之前的最多字符,并且 (III|II|I) 只能匹配一个字符您可以使用此正则表达式示例 ^(.*)\s(I+)$

    【讨论】:

      【解决方案3】:

      试试这个:

      $str="Olympic III";
      preg_match("#^(.*)\s(I+)$#",$str,$rep);
      print_r($rep);
      

      PHP Sandbox

      \s(I+)(III|II|I) 之前匹配单个空格,它解决了您的问题,因为它强制正则表达式匹配 (.*) 仅在有趣部分的开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-15
        • 2012-02-27
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多