如何在PHP的preg_match中精确匹配3位数?

时间:2012-11-25 21:53:30

标签: php regex string preg-match

假设您有以下值:

123
1234
4567
12
1

我正在尝试修改preg_match,它只会返回'123'的真值,因此只有3位才匹配。这就是我所拥有的,但它也匹配1234和4567.我也可以拥有它。

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

3 个答案:

答案 0 :(得分:23)

您需要的是anchors

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

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

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

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

或者,使用始终与字符串末尾匹配的\z,无论修饰符如何(感谢Ωmega):

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

你说过“我也可能会有一些东西”。如果这意味着你的字符串应该以正好三位数开头,但之后可以有任何东西(只要它不是另一个数字),你应该使用负向前瞻:

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

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

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

Further reading about lookaround assertions.

答案 1 :(得分:4)

你需要锚定正则表达式

/^\d{3}$/

答案 2 :(得分:4)

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

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

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

/\A\d{3}\z/