刚才在看正则表达式的子表达式,在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"?
因为是刚刚开始看,而且看的英文版,所以有理解错误请大家指正。
第一种情况
/(\d0)+/.exec("10000000");
中的+
量词是匹配优先的,即,\d0
匹配10
后不会马上停下来,继续匹配到最长的情况。所以第一种情况的第一个元素是
10000000
.第一个例子:
/(\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"]
关于
exec
返回的结果,第一项是匹配表达式的结果,第二项是与第一个子表达式相匹配的文本。第三项依次类推,是第二个子表达式相匹配的文本(如果有的话)。倒数第二项index
是匹配文本的位置索引。input
属性很好理解,被匹配的字符串。/(\d0)/
第一子表达式匹配的当然也就是10
了,不是题主所想的输出最后一个符合的字符串