我想从单词"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
文本