(?=[a-zA-Z]+)(?=[0-9]+)[a-zA-Z0-9]{3,10}
上面是我写的,但不正确,不知道原因。我理解的是第一个正向预查找出至少一个字母,和第二个正向预查找出至少一个字母。然后最后是[a-zA-Z0-9]{3,10},这大家都懂。不知道哪里错了,是不是我对正向预查的理解不正确?
(?=[a-zA-Z]+)(?=[0-9]+)[a-zA-Z0-9]{3,10}
上面是我写的,但不正确,不知道原因。我理解的是第一个正向预查找出至少一个字母,和第二个正向预查找出至少一个字母。然后最后是[a-zA-Z0-9]{3,10},这大家都懂。不知道哪里错了,是不是我对正向预查的理解不正确?
(?=...)是之后的内容满足..., 比如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]+)意味着这个位置后面紧跟至少一个字母,同时紧跟至少一个数字,也就是说这个位置后面的字符既是字母又是数字,显然这样的位置不存在。”
把你的正则稍作修改
再试试呢
个人觉得如果不仅限大小写字母和数字的话,这样匹配的范围会更多:/^(?=[a-zA-Z]*.*[0-9])(?=[0-9]*.*[a-zA-Z])[a-zA-Z0-9$@$!%*#?&]{2,}$/
10 回答11.2k 阅读
15 回答8.4k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
8 回答6.3k 阅读
2 回答2.7k 阅读✓ 已解决
?=
不同的人叫法不一样,你称之为预查
,我更倾向于叫零宽断言
,也就是说?=
只是匹配一个位置,并不匹配具体的字符,所以是零宽
,也就是宽度是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}$/
。