Re: [问题] 请问密码检测的正规表达式

楼主: art1 (人,原来不是人)   2019-02-01 18:20:36
※ 引述《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只允许等宽长度的字串
: ?
作者: s860134 (s860134)   2019-02-01 22:35:00
加上.*是因为 pattern 第一个字符是 ^ ,没有前导任意长度万用字符,会变成强制要第一个字符符合三种 assertion你的 pattern 将不会有任何匹配的可能
楼主: art1 (人,原来不是人)   2019-02-02 04:02:00
我给的例子都没加上^regex101.com标示出来的结果显示 ?=.*\d 符合的是一个数字前面的任意位置而不是我说的只有 c 与 4 之间这个位置?=\d 符合的才是 abc4efg 的 c 与 4 之间的单一位置
作者: s860134 (s860134)   2019-02-02 10:24:00
你知道 search 和 match 的差别吗?
楼主: art1 (人,原来不是人)   2019-02-02 12:36:00
有没有消耗字符的区别?

Links booklink

Contact Us: admin [ a t ] ucptt.com