正则匹配问题?

正则匹配问题?

var str = "8**8**88h11hhh11a*d*d*dd*_+";
var reg = /(?=.*[a-zA-Z])(?=.*[1-9])(?=.*[\W]).{6,}/; 
// 括号1 匹配字母
// 括号2 匹配数字
// 括号3 匹配字符
// 匹配一个包含数字、字母、字符6位以上字符的密码,但删除任意一个括号或全删除都是可以通过末尾的. 匹配到,如果删除.则匹配到[""]
// ?=.*[a-zA-Z]  ?=左边匹配的条件为空,是否只要满足右边条件即可匹配? 右边条件是包含.和*及[a-zA-Z]?
// [a-zA-Z]表示匹配字母,为何还要添加.(换行符)?
// *是否为括号内的正则如果第一个字符无法匹配,可以为零不匹配,还是仅代表.
var reg1 = /\D/; 
//表示除数字之外的任意字符,但为何无法匹配str中所有非数字部分,仅为["*"];如果str修改为aaa,则为null?
var reg2 = /[^a-zA-Z]*/g; 
// 匹配到["8**8**88"],*为至少匹配0个以上,为何不是匹配所有非字母?
console.log(reg3.exec(str));

麻烦老师帮忙解答,谢谢

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

1、[^a-zA-Z]整组放在一起,的确表示匹配除字母外的所有字符,但是这里需要注意的是g的作用,g是匹配串中所有匹配的子串(如果没有,找到一个之后匹配就结束了)

http://img1.sycdn.imooc.com//climg/5d319d790001cef416520350.jpg

lastIndex:每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置,我们检测到 /[^a-zA-Z]*/g匹配结束的位置是8

2、关于之前的第一条,老师的意思跟你自己理解的意思是一样的,可能老师解释的过于理论化,导致同学不太容易理解,如下老师帮你重新整理了解析:

http://img1.sycdn.imooc.com//climg/5d31a5760001f06508140255.jpg

之所以有左后的点能够匹配到所有的字符,是因为.表示匹配除换行符以外的任意字符,所以即便是删除了前面的某一组正则,也还是可以匹配到的,这个.点就相当于是一个指令,告诉浏览器我要匹配哪些字符,然后浏览器才会使用前面的几组正则去一一验证字符串中是否匹配的字符

希望可以帮到你!

  • 慕前端5517794 提问者 #1
    老师,你的解答还是针对正则字符。昨天我想通了原理,也不知道是否正确,但能解释的通。如(?=[a-zA-Z]).{6,}表示必须为字母,字母的右边为除换行符外的任意字符,匹配结果为h11hhh11a*d*d*dd*_+,因为h的前面为数字和字符,无法匹配。 (?=.*[a-zA-Z]).{6,}则表示任意字符后面为字母,并且跟着任意字符。h的前面为字母和数字(8**8**88),可以理解为任意字符,h就可以理解为字母 ,而字母后面为任意字符,所以以此推论,可以匹配整个str。以上解释是否正确,麻烦老师看下
    2019-07-19 20:17:17
  • 卡布琦诺 回复 提问者 慕前端5517794 #2
    原来是同学是不知道匹配原理,老师一直以为你是不知道这段正则代码的意思嘞,匹配原理是同学理解的这样的。
    2019-07-19 20:24:05
提问者 慕前端5517794 2019-07-18 23:30:18

老师,我没理解清楚你说的第1点,网上查到的都是对于正则字符的解释,而不是为什么会产生这样的匹配,麻烦老师再解答下

解析:
(1)必须是有括号包裹
(2)断言是不会占用字符串

(?=.*[a-zA-Z])(?=.*[1-9])(?=.*[\W]).{6,}
   ?=表示必须满足?=右边的条件,3个括号分别表示字符的右边为字母、数字、字符,
   .*表示匹配除换行符之外的所有字符,匹配数量为0或及以上。

var str = "8**8**88h11hhh11a*d*d*dd*_+?";
console.log(str.replace(/(?=[a-zA-Z]).{6,}/,"#"));
console.log(/(?=[a-zA-Z]).{6,}/.exec(str)) // h11hhh11a*d*d*dd*_+

console.log(/(?=.*[a-zA-Z]).{6,}/.exec(str)) // 8**8**88h11hhh11a*d*d*dd*_+


第3点
[^a-zA-Z]这样写法不是除字母外的意思?


卡布琦诺 2019-07-13 16:49:54

1、(1)(?=.*[a-zA-Z])这种写法意思是断言,返回的匹配结果仅包含与第一部分表达式匹配的文本,所以同学的表达式与其他通配符连用才能起到效果,(?=.*[\W])([a-zA-Z])\D+这个就表示匹配以任意字符开头的大写字母或者是小写字母,只匹配字母。但是由于返回的匹配结果仅包含与第一部分表达式匹配的文本,所以匹配不到后面的d,只能匹配到h。按照同学的代码(?=.*[a-zA-Z])来讲,.*[a-zA-Z]表示的是匹配范围,缺少后面的匹配条件,比如(?=中国)人。匹配到的是中国人的人字,而不是美国人的人字。这里非常难理解,同学可以作为拓展来了解一下即可

(2) .用来匹配除了换行符以外的任何字符,也就是说,不管前面的匹配条件是啥,都会按照最后面的.匹配除了换行符以外的所有字符

2、\D表示匹配任意非数字的字符,但是\D不是全局匹配,当匹配到第一个*的时候,会认为是匹配到了。就直接返回了,所以匹配到的是一个*,并且改成aaa,老师这里是可以匹配到的

http://img1.sycdn.imooc.com//climg/5d2999970001478519160821.jpg


3、这里测试是可以匹配到数字的

另外,不太理解为什么同学自己的写了一段正则表达式,却不知道其含义,还是说这段代码是同学在网上查找到的又或者是随便写的呢
希望可以帮到你!

  • 提问者 慕前端5517794 #1
    老师,在上面回复你了,麻烦看下,谢谢
    2019-07-18 23:31:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师