javascript - 正则表达式新手求解?
PHPz
PHPz 2017-04-10 14:36:42
0
3
692

刚才在看正则表达式的子表达式,在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"?

因为是刚刚开始看,而且看的英文版,所以有理解错误请大家指正。

PHPz
PHPz

学习是最好的投资!

全部回覆(3)
迷茫

第一种情况/(\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"]

迷茫

先说下正则表达式里的一个概念 贪婪与非贪婪匹配
1. 贪婪匹配会尽可能多的匹配: /(\d0)+/是贪婪匹配,先匹配了10,然后会继续匹配, 00也是符合 (\d0)的。所以一直匹配下去了。 你可以把 10000000减掉一个0 ,就会发现匹配结果会少一个0,因为最后一个0不匹配(\d0)。去掉(),结果就不一样了,量词+号只修饰 0
2. 非贪婪匹配: 尽可能少的匹配。/(\d0)/ 匹配了第一个10,符合表达式,就停止继续匹配了。所以结果是10

关于 exec返回的结果,第一项是匹配表达式的结果,第二项是与第一个子表达式相匹配的文本。第三项依次类推,是第二个子表达式相匹配的文本(如果有的话)。倒数第二项 index是匹配文本的位置索引。input属性很好理解,被匹配的字符串。/(\d0)/第一子表达式匹配的当然也就是10了,不是题主所想的输出最后一个符合的字符串

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!