为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式新手求解?

正则表达式新手求解?

千万里不及你 2019-04-13 08:46:16
刚才在看正则表达式的子表达式,在exec方法里如果有子表达式的话,也会返回符合自表达式的字符串。我写了两个例子/(\d0)+/.exec("10000000");//["10000000","00",index:0,input:"10000000"]第一个输出应该是符合整个正则表达式的字符串,为什么不是"10"?第二个书输出应该是符合子表达式(\d0)的字符串,因为是输出最后一个符合的,所以是"00"第二个例子/(\d0)/.exec("10000000");["10","10",index:0,input:"10000000"]第一个输出"10"我可以理解,第二个不是应该是最后一个符合的字符串"00"么,为什么也是"10"?因为是刚刚开始看,而且看的英文版,所以有理解错误请大家指正。
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

第一种情况/(\d0)+/.exec("10000000");中的+量词是匹配优先的,即,\d0匹配10后不会马上停下来,继续匹配到最长的情况。
所以第一种情况的第一个元素是10000000.
                            
查看完整回答
反对 回复 2019-04-13
?
aluckdog

TA贡献1847条经验 获得超7个赞

第一个例子:
/(\d0)+/.exec("10000000");
分开来看,首先,\d0的意思是,匹配1个数字和0,然后(\d0)用括号括起来表示这是一个分组,+表示这个分组至少要给老子匹配1次!不然就别说你匹配了!o( ̄▽ ̄)o(如果少于1次,即0次算作是匹配失败的,但是如果是*,即使是0次也算作匹配成功了,因为*代表的数量虽然也是越多越好,但是可以为0)
好,对应10000000来讲,1开始,10满足\d0?是的!继续,发现后面剩下的都可以满足,即整个字符串可以分成(10)(00)(00)(00)四个段来看,每段都满足1个数字加0的情况,所以整个字符串就匹配啦,输出~
/(\d0)+/虽然意思是表示很多个分组,但是字面上只有一个分组,就是(\d0),这个分组具体代表的内容随着匹配向前走而改变,最后代表的是(10)(00)(00)(00)四个分段中的最后一个,即00,输出~
第二个例子:
/(\d0)/.exec("10000000");
原理一样,还是从1开始,10满足\d0,OK,匹配停止,虽然可以把10000000分成(10)(00)(00)(00)四个分段,虽然每个分段都匹配,不过这次/(\d0)/只能匹配一个分段了(正则表达式分组后面没有数量词如+*{n,m}等),所以,整个正则表达式匹配的结果就是10,然后(\d0)是这个这则表达式的第一个分组,同时也是唯一一个分组,输出~所以就是10了。
具体到题主的疑惑,我想是对于“输出最后一个符合的”的理解了。实际上,如果匹配,exec输出一个数组,数组第一个元素是匹配到的整个字符串,然后,如果正则表达式里面有分组,就输出分组匹配到的内容,这里不能分开说,不能把这个分组单独抽出来去匹配原始字符串,而是针对匹配到的结果那里来讲的,个人理解成,输出它对这次成功匹配的功劳。
再举个例子
/(\d0)+/.exec("6100020506730");
字符串从6开始,61?不行,继续往后走,10?可以了。10后面的00?满足(\d0)!00后面的20?满足(\d0)!20后面的50?满足(\d0)!50后面的67?这次不行了,匹配到此为止!不管后面有什么,即使末尾有一个30也不管了,都不管了!所以,最后的匹配到了10002050这一段,分一下组(10)(00)(20)(50),最后一个分组是50;
所以/(\d0)+/.exec("6100020506730");的结果就是["10002050","50"]
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信