【发布时间】:2012-11-13 09:38:43
【问题描述】:
假设您有以下值:
123
1234
4567
12
1
我正在尝试纠正一个 preg_match,它只会为“123”返回 true,因此只匹配 3 位数字。这是我的,但它也匹配 1234 和 4567。我可能也有它之后的东西。
preg_match('/[0-9]{3}/',$number);
【问题讨论】:
标签: php regex string preg-match
假设您有以下值:
123
1234
4567
12
1
我正在尝试纠正一个 preg_match,它只会为“123”返回 true,因此只匹配 3 位数字。这是我的,但它也匹配 1234 和 4567。我可能也有它之后的东西。
preg_match('/[0-9]{3}/',$number);
【问题讨论】:
标签: php regex string preg-match
你需要的是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。使用否定的lookbehind,同样可以应用于正则表达式的开头(如果abc123def 应该给出匹配):
preg_match('/(?<![0-9])[0-9]{3}(?![0-9])/',$number);
【讨论】:
D 标志,以便$ 不能锚定在尾随换行符之前。 preg_match('/^[0-9]{3}$/', "444\n");
/^[0-9]{3}\z/(小写 z)
你需要锚定正则表达式
/^\d{3}$/
【讨论】:
如果您在文本中的任意位置搜索 3 位数字,请使用正则表达式模式
/(?<!\d)\d{3}(?!\d)/
但是,如果您检查输入只是 3 位数字而不是其他数字,那么请继续
/\A\d{3}\z/
【讨论】: