正则表达式以匹配前面没有字母的数字



我想从单词"minimum"之前的字符串中获取第一个数字,前面有一个空格,而不是后面是"-"。例:

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

我正在尝试使用以下代码:

$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 前面有一些字符。

谁能帮我解决这个问题?提前谢谢。

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

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

请参阅正则表达式演示。

  • (?<![p{L}d]-|d) - 如果当前位置左侧有一个字母或数字后跟 - 或单个数字,则匹配失败
  • d+ - 1+ 位数字
  • (?!-d) - 负前瞻,如果有一个-,则匹配失败,然后紧邻当前位置右侧
  • 的数字
$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
        )
)
您可以使用

多个环顾断言来使用此正则表达式:

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

正则表达式演示

解释:

  • (?<=s):否定回头断言我们在之前的位置有一个空格
  • d+b:匹配 1+ 位数字,后跟单词边界断言
  • (?!-d+):消极的展望,断言我们没有-<digits>
  • (?=.*Minimum) : 展望未来,断言我们前面有Minimum文本

最新更新