正则表达式,3-10位必须包含至少1个数字和1个字母,为何我这样写不对?

(?=[a-zA-Z]+)(?=[0-9]+)[a-zA-Z0-9]{3,10}

上面是我写的,但不正确,不知道原因。我理解的是第一个正向预查找出至少一个字母,和第二个正向预查找出至少一个字母。然后最后是[a-zA-Z0-9]{3,10},这大家都懂。不知道哪里错了,是不是我对正向预查的理解不正确?

阅读 10k
10 个回答

?=不同的人叫法不一样,你称之为预查,我更倾向于叫零宽断言,也就是说?=只是匹配一个位置,并不匹配具体的字符,所以是零宽,也就是宽度是0。
所以(?=[a-zA-Z]+)匹配一个位置,这个位置后面紧跟至少一个字母,注意此时位置并没有后移;
(?=[0-9]+)也是匹配一个位置,这个位置后面后面紧跟至少一个数字;
因为(?=[a-zA-Z]+)(?=[0-9]+)都只匹配位置,而不匹配具体的字符,这两个又直接写在了一起,也就是说(?=[a-zA-Z]+)(?=[0-9]+)意味着这个位置后面紧跟至少一个字母,同时紧跟至少一个数字,也就是说这个位置后面的字符既是字母又是数字,显然这样的位置不存在。

Update:
你试试这个/^(?=[a-zA-Z]*[0-9])(?=[0-9]*[a-zA-Z])[a-zA-Z0-9]{3,10}$/

正确的写法:(?=\w{3,10})


既然题目改了,再写一次吧~
^(?=\w{3,10}$)(?=.*[^\d\W])(?=.*\d).+

(?=...)是之后的内容满足..., 比如a(?=d)即匹配a后面是数字的a
如果是匹配之前的(?<=...)
因不清楚楼主的具体目的,不知道这个对么, Python的:

import re
pt = re.compile(r'(.)(?=[a-zA-Z])(\w)(?=[0-9])[a-zA-Z0-9]{3,10}')
s = 'ab1234567890badasbb'
rc = re.search(pt, s)
print(rc.group(0))
var reg = /^(?![a-zA-Z]{3,10}$)(?![0-9]{3,10}$)[a-zA-Z0-9]{3,10}$/;
console.log(reg.test('12abC'));
console.log(reg.test('aaaaaA'));
console.log(reg.test('aaaaa1'));
console.log(reg.test('aaa1A中'));
console.log(reg.test('aaa1A*'));

拆开写两个吧 一个是检测长度,一个是检测类型

解释一下 你自己正则为什么失败:
一楼其实说的很清楚“(?=[a-zA-Z]+)和(?=[0-9]+)都只匹配位置,而不匹配具体的字符,这两个又直接写在了一起,也就是说(?=[a-zA-Z]+)(?=[0-9]+)意味着这个位置后面紧跟至少一个字母,同时紧跟至少一个数字,也就是说这个位置后面的字符既是字母又是数字,显然这样的位置不存在。”

把你的正则稍作修改
clipboard.png

再试试呢

问题已解决,谢谢各位。出错的原因是对正向预查理解的错误,现在基本已经理解。

/(?=(?:\d+|\w+){3,10})/

这个可以吗?

个人觉得如果不仅限大小写字母和数字的话,这样匹配的范围会更多:
/^(?=[a-zA-Z]*.*[0-9])(?=[0-9]*.*[a-zA-Z])[a-zA-Z0-9$@$!%*#?&]{2,}$/

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题