匹配数字的正则表达式不在字母之前

时间:2018-03-06 11:05:53

标签: php regex

我希望在“' minimum'”之前从字符串中获取第一个数字,前面有一个空格,而不是“' - '”。例如:

  • 不应该匹配单词2-3,TT-89等; (即,后跟一个数字 - 和另一个数字或字母后跟 - 和数字)
  • 应匹配单词2-rolls(即数字后跟 - 和字母)

我尝试使用以下代码:

$str = "Red  QQ-4555 White  TT-789 Yellow Minimum order applies. This is a test";
$explodeByMinimumArray = preg_split("/minimum/i", str_replace(array( '(', ')' ), ' ', $str));   
preg_match_all('/\d+(?!-\d)/', $explodeByMinimumArray[0], $numberFromStringBeforeMinimumArray);  
print_r($numberFromStringBeforeMinimumArray);

这将$numberFromStringBeforeMinimumArray作为:

返回
Array
(
    [0] => Array
        (
            [0] => 4555 
            [1] => 789
        )

)

但是预期的输出是空的,因为QQ-4555和TT-789前面有一些字符。

任何人都可以帮我解决这个问题吗?提前致谢。

3 个答案:

答案 0 :(得分:1)

您需要使用负面的lookbehind来确保您不匹配前面带有字母/数字和-的数字:

(?<![\p{L}\d]-|\d)\d+(?!-\d)

请参阅regex demo

<强>详情

  • (?<![\p{L}\d]-|\d) - 如果有一个字母或数字后跟-或一个数字紧靠当前位置的左侧,则会导致匹配失败的负面反馈
  • \d+ - 1+位数
  • (?!-\d) - 如果有一个-,然后是一个位于当前位置右侧的数字,则会导致匹配失败的否定前瞻

答案 1 :(得分:0)

$str = "Red  QQ-4555 White  TT-789 123 Yellow Minimum order applies. This is a test ";
$explodeByMinimumArray = preg_split("/minimum/i", str_replace(array( '(', ')' ), ' ', $str));   
preg_match_all('/\s+\d+(?!-\d)/', $explodeByMinimumArray[0], $numberFromStringBeforeMinimumArray);  
print_r($numberFromStringBeforeMinimumArray);

将给出

Array
(
    [0] => Array
        (
            [0] =>  123
        )

)

答案 2 :(得分:0)

您可以使用多个外观断言来使用此正则表达式:

(?<=\s)\d+\b(?!-\d+)(?=.*Minimum)

RegEx Demo

<强>解释

  • (?<=\s):断言,断言我们在前一个位置有空格
  • \d+\b:匹配1+位后跟单词边界断言
  • (?!-\d+):断言先前声明我们没有-<digits>提前
  • (?=.*Minimum):预见断言我们前面有Minimum文字