刚才在看正则表达式的子表达式,在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"?
因为是刚刚开始看,而且看的英文版,所以有理解错误请大家指正。
迷茫2017-04-10 14:38:42
第一种情况/(\d0)+/.exec("10000000");
中的+
量词是匹配优先的,即,\d0
匹配10
后不会马上停下来,继续匹配到最长的情况。
所以第一种情况的第一个元素是10000000
.
迷茫2017-04-10 14:38:42
/(\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"]
迷茫2017-04-10 14:38:42
先说下正则表达式里的一个概念
贪婪与非贪婪匹配
1. 贪婪匹配会尽可能多的匹配:/(\d0)+/
是贪婪匹配,先匹配了10
,然后会继续匹配,00
也是符合(\d0)
的。所以一直匹配下去了。 你可以把10000000
减掉一个0 ,就会发现匹配结果会少一个0,因为最后一个0
不匹配(\d0)
。去掉()
,结果就不一样了,量词+
号只修饰0
2. 非贪婪匹配: 尽可能少的匹配。/(\d0)/
匹配了第一个10
,符合表达式,就停止继续匹配了。所以结果是10
关于 exec
返回的结果,第一项是匹配表达式的结果,第二项是与第一个子表达式相匹配的文本。第三项依次类推,是第二个子表达式相匹配的文本(如果有的话)。倒数第二项 index
是匹配文本的位置索引。input
属性很好理解,被匹配的字符串。/(\d0)/
第一子表达式匹配的当然也就是10
了,不是题主所想的输出最后一个符合的字符串