亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式新手求解?

正則表達式新手求解?

千萬里不及你 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 關注
  • 333 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號