jcpython2 发表于 2022-12-28 12:11:53

正则表达式校验疑惑

在写一个正则表达式,目标功能是 提取包含大小写字母的字符串



我的写法 (?=)(?=)


我的思路 正向先行断言两次分别是大小写字母,



正确答案是 (?=.*?)(?=.*?).+

请问正确答案中的=.*?起到什么作用,为什么我不加连a-z都匹配不到?

最后为啥要A-Z加上.+,而前面a-z不用加.+??

jcpython2 发表于 2022-12-28 12:50:16

(?=.*?)

这条直白点的回溯条件是:什么都可以有,但必须有a-z   是这样吗?

isdkz 发表于 2022-12-28 13:00:29


一、

(?=)(?=) 是不可能有匹配的,

如果不加 .*? 使断言中的字符串长度不固定的话,

(?=) 和 (?=) 是矛盾的,有什么字符既是小写又是大写的?

不可能有既是小写字母开头又是大写字母开头的字符串,自然什么也匹配不上了


二、断言只是相当于一个条件而已,限制了要匹配的字符串要以什么开头或以什么结尾,

匹配表达式是断言后面的内容,

(?=.*?)(?=.*?).+ 这个可以匹配上以 .*? 开头且以 .*? 开头的任意字符组成的字符串 .+

(?=.*?)(?=.*?) 你去掉 .+ 的话就是匹配以 .*? 开头且以 .*? 开头的空字符,即使满足断言匹配上了你也只能得到空字符

isdkz 发表于 2022-12-28 13:06:00

本帖最后由 isdkz 于 2022-12-28 13:07 编辑

jcpython2 发表于 2022-12-28 12:50
这条直白点的回溯条件是:什么都可以有,但必须有a-z   是这样吗?

可以这么说,而且使 的位置不确定的话不会跟 (?=.*?) 冲突,

因为没有一个字符同时满足 和 的,

(?=)(?=) 这个断言很明显就把 和 都限制在第一个位置,这是不可能满足的条件

jcpython2 发表于 2022-12-28 13:29:33

isdkz 发表于 2022-12-28 13:00
一、

(?=)(?=) 是不可能有匹配的,


首先感谢老哥如此详细,也讲得很通透

现在说说我的理解看还有错漏不


因为两个()()的都是条件,如果我不写.+就是没有告诉系统我到底要拿符合这个条件的什么出来,当我加了.+告诉他是在任意内容任意次数的符合()()条件的元素

isdkz 发表于 2022-12-28 13:40:47

本帖最后由 isdkz 于 2022-12-28 13:44 编辑

jcpython2 发表于 2022-12-28 13:29
首先感谢老哥如此详细,也讲得很通透

现在说说我的理解看还有错漏不


没有加 .+ 也不算没有告诉系统要拿符合这个条件的什么出来,

只能说是取符合这个条件的空字符,什么都没有也就是有空嘛,

他总要有个能匹配的东西的,如果他无法确定要匹配什么估计会出错的


jcpython2 发表于 2022-12-28 13:53:27

isdkz 发表于 2022-12-28 13:40
没有加 .+ 也不算没有告诉系统要拿符合这个条件的什么出来,

只能说是取符合这个条件的空字符,什么 ...

万分感谢
页: [1]
查看完整版本: 正则表达式校验疑惑