我正在尝试匹配我们的订单号(始终采用ABC + 6或7位数字格式)。例如ABC123456或ABC1234567
我有:
preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})/", $content, $matches);
但是,如果有人向我们报出ABC12345678,那么它正在提取ABC1234567。这是不正确的。相反,preg_match_all不应该找到匹配。
如何修改正则表达式以说“所有出现的ABC后跟6或7位数。忽略第7个字符后面的字符为数字的任何内容”
答案 0 :(得分:3)
preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})(?![0-9])/", $content, $matches);
这将匹配ABC1234567,除了数字之外的7之后的任何内容。
(?![0-9])
之前的部分仅在(?!...)
内的部分不匹配时匹配。因此,如果您不想在7
后面写一封信,请执行以下操作:
preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})(?![0-9a-zA-Z])/", $content, $matches);
如果您不想要_
字符,请执行以下操作:
preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})(?![0-9a-zA-Z_])/", $content, $matches);
这实际上相当于使用\b
:
preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})\b/", $content, $matches);
答案 1 :(得分:2)
使用此正则表达式:
/\b(ABC)[0-9]{6,7}\b/
OR
/^(ABC)[0-9]{6,7}$/
答案 2 :(得分:0)
尝试添加$
,例如:
preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})$/", $content, $matches);
答案 3 :(得分:0)
将单词结尾指定为
preg_match_all("/(ABC)([0-9]{6}|[0-9]{7}\>)/", $content, $matches);
答案 4 :(得分:0)
你也可以使用这个模式:
^(ABC)\d{6,7}$
下面
^ = Starts with
(ABC) = ABC
\d = followed by digits between 0-9 inclusive.
{6,7} = 6 or 7 times
$ = till the end of the order number