12

假设您具有以下值:

123
1234
4567
12
1

我正在尝试纠正一个 preg_match,它只会为 '123' 返回 true,因此仅匹配 3 位数字。这就是我所拥有的,但它也匹配 1234 和 4567。我可能也有一些东西。

preg_match('/[0-9]{3}/',$number);
4

3 回答 3

30

你需要的是锚点

preg_match('/^[0-9]{3}$/',$number);

它们表示字符串的开始和结束。您需要它们的原因是,通常正则表达式匹配会尝试在主题中找到任何匹配的子字符串。

正如 rambo coder 指出的那样$,如果最后一个字符是新行,则也可以在字符串中的最后一个字符之前匹配。要更改此行为(这样456\n不会导致匹配),请使用D修饰符:

preg_match('/^[0-9]{3}$/D',$number);

或者,使用\zwhich 始终匹配字符串的最后,无论修饰符如何(感谢 Ωmega):

preg_match('/^[0-9]{3}\z/',$number);

你说“我也可能有一些事情”。如果这意味着您的字符串应该以三个数字开头,但之后可以有任何内容(只要它不是另一个数字),您应该使用负前瞻:

preg_match('/^[0-9]{3}(?![0-9])/',$number);

现在它也会匹配123abc。使用否定的lookbehind ,同样可以应用于正则表达式的开头(如果abc123def应该给出匹配):

preg_match('/(?<![0-9])[0-9]{3}(?![0-9])/',$number);

关于环视断言的进一步阅读。

于 2012-11-25T21:54:19.467 回答
4

您需要锚定正则表达式

/^\d{3}$/
于 2012-11-25T21:54:28.663 回答
4

如果您在文本中的任何位置搜索 3 位数字,请使用正则表达式模式

/(?<!\d)\d{3}(?!\d)/

但是,如果您检查输入只是 3 位数字而不是其他数字,那么请使用

/\A\d{3}\z/
于 2012-11-25T23:42:05.737 回答