【发布时间】:2021-09-30 03:11:29
【问题描述】:
我使用正则表达式已经很多年了,在编写正则表达式时从来没有遇到过这么大的麻烦。我正在使用 PHP 7.2.2 的 preg_match() 返回一个匹配数字的数组以进行解析,因此正则表达式中的括号。
我正在尝试匹配一个或多个数字,后跟一个x,后跟一个或多个数字,其中整个字符串后面没有连字符。当 $input 为 18x18、18x18- 或 18x18size 时,匹配项为 18 和 1。当$input 为8x8 时,没有匹配项。
我似乎在这里做一些根本错误的事情。
<?php
$input = "18x18";
preg_match("/(\d+)x(\d+)[^-]/", $input, $matches);
调用print_r($matches) 会导致:
Array
(
[0] => 18x18
[1] => 18
[2] => 1
)
括号在那里是因为我使用 PHP 的 preg_match 来返回匹配数组。我知道什么时候应该转义连字符,我已经尝试了两种方法来确定,但得到了相同的结果。为什么不匹配?
【问题讨论】:
-
你想像
'~(\d+)x(\d++)(?!-)~'一样吗? -
PCRE 正则表达式不应与不支持所有格量词的 Python
re混淆,因此它不能作为 Negative lookahead not working after character range with plus quantifier 重复关闭。 -
这个问题不是关于所有格量词的使用。它是关于匹配不跟随字符的东西。如selected answer 中所示,单词边界解决方案对于
python和php来说是足够的。 -
不,这并不总是足够的。字边界根本不是一个解决方案,它是一个workaround。
(\d+)x(\d+)\b(?!-)won't match12x24size中的大小,而(\d+)x(\d++)(?!-)will。 -
12x24size不是 OP 要求的一部分。要求应该来自 OP 而不是来自发布的答案。