正则表达式考虑下一个字符

时间:2013-05-23 13:46:50

标签: php regex

我正在尝试匹配我们的订单号(始终采用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个字符后面的字符为数字的任何内容”

5 个答案:

答案 0 :(得分:3)

您需要negative lookahead

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)

  1. 您可以将6到7位数的检查合并为1
  2. 使用单词边界或输入开始/结束锚点
  3. 使用此正则表达式:

    /\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