如何修改PHP正则实现字符串最多3个数字其余字符无数量限制
PHP正则修改方案
原有正则失效原因
/^[-\p{L}\d{0,3}]+$/u:量词{0,3}写在字符集[]内部会被识别为普通可匹配字符,无法起到限制数字数量的作用/^[-\p{L}]+[\d]{0,3}+$/u:逻辑上限制数字只能出现在字符串末尾,不符合数字可在任意位置的需求,同时末尾多余的+会造成量词冲突/^([-\p{L}]+)([\d]+){0,3}$/u:仅支持数字成组出现在非数字内容之后,且限制的是数字组的数量不是数字本身的数量,完全不符合需求
正确正则写法
/^(?=(?:\D*\d){0,3}\D*$)[-\p{L}\d]+$/u
实现逻辑
- 开头的
(?=(?:\D*\d){0,3}\D*$)是零宽正向先行断言,会先校验整个字符串中数字的总出现次数不超过3次,不限制数字位置 - 后面的
[-\p{L}\d]+$校验所有字符都属于允许的范围:Unicode字母、短横线、数字,和你原有正则的字符校验逻辑一致
匹配验证
完全符合你给出的测试用例要求:
test345:匹配(共3个数字,符合上限)345te-st:匹配(共3个数字,符合上限)3454dtest:不匹配(共4个数字,超出上限)
内容的提问来源于stack exchange,提问作者bobrok dmitrey
相关产品推荐
相关产品推荐

