正则表达式新手求解?

刚才在看正则表达式的子表达式,在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"?
因为是刚刚开始看,而且看的英文版,所以有理解错误请大家指正。
千万里不及你
浏览 320回答 2
2回答

明月笑刀无情

第一种情况/(\d0)+/.exec("10000000");中的+量词是匹配优先的,即,\d0匹配10后不会马上停下来,继续匹配到最长的情况。所以第一种情况的第一个元素是10000000.

aluckdog

第一个例子:/(\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"]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript