代码之家  ›  专栏  ›  技术社区  ›  Honinbo Shusaku

PHP正则表达式不正确

  •  1
  • Honinbo Shusaku  · 技术社区  · 9 年前

    我正在尝试提取所有看起来像 12-15 来自父字符串。这意味着所有在两个数字之间有破折号的字符串。

    使用 this 作为基础,我尝试了以下方法:

    <?php
    
    $str = "34,56,67-90,45";
    preg_match('/^(\d-\d)|(,\d-\d)|(\d-\d,)|(,\d-\d,)$/', $str, $output, PREG_OFFSET_CAPTURE);
    echo print_r($output);
    
    ?>
    

    这将查找任何看起来像数字之间的破折号的子字符串,无论它之前、之后或两者都有逗号,还是没有逗号。当我运行PHP代码时,我得到一个空数组。在Regex101上,当我测试正则表达式时 4-5,,,,, 我不明白为什么它让我加上额外的逗号。

    我得到一个空数组的正则表达式有什么问题?

    3 回复  |  直到 8 年前
        1
  •  4
  •   CollinD    9 年前

    我想你可以使用这样一个简单的正则表达式

    \d+[-]\d+
    

    即(至少匹配1个数字)(匹配文字破折号)(至少匹配一个数字)

        2
  •  2
  •   Barmar    9 年前

    \d 匹配一个数字。样本字符串中的所有数字都有两位数。你应该使用 \d+ 以匹配任意数量的数字。

    preg_match('/^(\d+-\d+)|(,\d+-\d+)|(\d+-\d+,)|(,\d+-\d+,)$/', $str, $output, PREG_OFFSET_CAPTURE);
    

    输出:

    Array
    (
        [0] => Array
            (
                [0] => ,67-90
                [1] => 5
            )
    
        [1] => Array
            (
                [0] => 
                [1] => -1
            )
    
        [2] => Array
            (
                [0] => ,67-90
                [1] => 5
            )
    
    )
    

    您还可以简化正则表达式:

    preg_match('/(?:^|,)\d+-\d+(?:,|$)/', $str, $output, PREG_OFFSET_CAPTURE);
    

    输出:

    Array
    (
        [0] => Array
            (
                [0] => ,67-90,
                [1] => 5
            )
    
    )
    
        3
  •  1
  •   Mariano    9 年前

    这个 | 具有优先权,表示您的表达式被解释为“匹配以下任一项:

    1. 文本的开始->1位->破折号->1位(不匹配文本结尾)
    2. 逗号(可以在文本中间的任何位置)->1位->破折号->1位
    3. 1位(任意位置)->破折号->1位->逗号
    4. 逗号(任意位置)->1位->破折号->1位->逗号->文本结束

    此外,您正在使用 \d 其匹配1位(仅一个字符)。您可以使用 \d{2} 匹配2位数字(00到99),或 \d+ 以匹配任何整数(1、55、123456等)。


    在你的情况下,我认为你试图使用这个表达式:

    /(?:^|,)(\d+-\d+)(?=,|$)/
    

    这意味着:文本开始或逗号->任何整数->破折号->任何整数->后跟一个逗号或文本结尾(但不使用inmatch)