※ 引述《jijuan ()》之铭言:
: 看到一个题目是长度为8的密码,
: 必须至少含有一个大写字母、一个小写字母和一个数字,
: 找到这个正规表达式,
: ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8}$
我会这样解读
.*\d 代表一个数字前面可以为任意字符
或说任意字符之后一定要出现一个数字
.*[a-z] 代表一个小写字母前面可以为任意字符
或说任意字符之后一定要出现一个小写字母
.*[A-Z] 代表一个大写字母前面可以为任意字符
或说任意字符之后一定要出现一个大写字母
三个条件都用 ?= 包起来,代表这三者要同时成立才是想要的字串
?=.*\d 找到的是一个数字前方的位置,例如 abc4def
c与4之间的那个位置就符合此规则
其余同理
至于加 .* 的理由是 ?=\d 跟 ?=[a-z] 并用会导致不存在符合的情况
我不知道要怎么解释比较正确,感觉上像是两者找到的位置是不可能同时存在的
而字串 abc4efg 使用 (?=.*\d)[a-z] 筛选,符合的是 a、b、c 三笔资料
字串 abc4efg 使用 (?=.*\d)a 筛选,符合的是 a
字串 abc4efg 使用 (?=.*\d)b 筛选,符合的是 b
字串 abc4efg 使用 (?=.*\d)c 筛选,符合的是 c
字串 abc4efg 使用 (?=.*\d)e 筛选,找不到符合的
字串 4efg 使用 (?=.*\d)e 筛选,找不到符合的
加上 .* 让原本的 \d 规则限制变宽了
: 有几个地方不懂想请问,
: (1)?=这部分是Positive lookahead,查了一下它的定义是:
: Positive lookahead works just the same. q(?=u) matches a q that is followed
: by a u, without making the u part of the match.
: 所以第一个括号里,是 .*\d 这一部分被视为u吗?这样的话q是指哪部分呢?
: 对第二个括号来说,它前面的(?=.*\d)被视为q吗?还是每个括号都是独立的分组?
: 还是说因为lookahead本身不会消耗字符,所以在没有 q的情况下,就把它当作是一个
: 判断句来用这样?
: (2).*用来匹配所有东西,那为什么后面还跟着\d?我现在的理解是,假设"abFj45dE"
: 是我要比对的密码,比对到4这个数字时,abFj就是.*的部分吗?也就是说必须符合一
: 串字符之后必须0-9之间的数字这样?还是说(?=.*)本身就是一个特定的写法?
: (3)另外根据语言的不同,是不是有些正规表达式中lookbehind只允许等宽长度的字串
: ?