jQuery源碼:正則表達(dá)式rquickExpr分析

jQuery中有一個(gè)大量用到的正則表達(dá)式rquickExpr

const rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/

可以文字化為

const rquickExpr = /^(?:#(id選擇器名稱(chēng))|(標(biāo)簽選擇器名稱(chēng))|\.(類(lèi)選擇器名稱(chēng))$/

其作用是來(lái)匹配一些簡(jiǎn)單的id選擇器、標(biāo)簽選擇器、類(lèi)選擇器,如:#id、div、.class
那具體是怎么區(qū)分哪些是id選擇器,哪些是標(biāo)簽選擇器,哪些是類(lèi)選擇器呢?

const rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/;
var match = selector.match(reg);    //selector為傳入的選擇器
if(match[1]){
    //ID選擇器
}else if(match[2]){
    //標(biāo)簽選擇器
}else if(match[3]){
    //類(lèi)選擇器
}

注:jQuery源碼中用的是exec()方法,exec()match()的區(qū)別是:無(wú)論是否為全局模式,exec() 都會(huì)把完整的細(xì)節(jié)添加到它返回的數(shù)組中。故這里用match代替exec也可以

為什么可以用上面簡(jiǎn)單的代碼就可以區(qū)分呢?我們可以看一下當(dāng)selector分別為#iddiv、.class的匹配輸出信息

image.png

match分析

  • 在全局模式下,match的返回值為匹配到的所有元素組成的數(shù)組,如:
"ab".match(/a/g)    //輸出['a']
  • 在非全局模式下,match的返回值為匹配到的元素詳細(xì)
"ab".match(/a|c/)    //輸出["a", index: 0, input: "ab", groups: undefined]

返回值["a", index: 0, input: "ab", groups: undefined]解釋?zhuān)?br> "a":與正則表達(dá)式相匹配的文本
如果有組的話,這里還會(huì)有與 RegExpObject 的第 1~n 個(gè)子表達(dá)式相匹配的文本(見(jiàn)后)
index: 0:匹配文本的第一個(gè)字符的位置
input: "ab":被檢索的字符串
groups: undefined:存儲(chǔ)命名捕獲組的信息

groups:存儲(chǔ)命名捕獲組的信息

// 命名捕獲組的獲取
let reg1 = /(?<first>\d)(?<second>\d)/
let str2 = '123'

console.log(reg2.exec(str2).groups) 
// => { first: 1, second: 2 }   新的語(yǔ)法支持對(duì)這些捕獲組進(jìn)行命名,更方便地獲>取某個(gè)捕獲組的數(shù)據(jù)

匹配多個(gè)組時(shí)

var match = "ac".match(/(a)|(b)/)
//輸出["a", "a", undefined, index: 0, input: "ac", groups: undefined]
var match = "bc".match(/(a)|(b)/) 
 //輸出["b", undefined, "b", index: 0, input: "bc", groups: undefined]

上面輸出數(shù)組里的第二個(gè),第三個(gè)元素是"a"undefined,與(a)匹配的文本返回的是"a",與(b)匹配的文本返回的是undefined(與 RegExpObject 的第 1~n 個(gè)子表達(dá)式相匹配的文本)

此時(shí)對(duì)于正則表達(dá)式/(a)|(b)/,有如下規(guī)律:

if(match[1]){
    //匹配到了a
}else if(match[2]){
    //匹配到了b
}

這就是區(qū)分哪些是id選擇器,標(biāo)簽選擇器,類(lèi)選擇器的原因了

非獲取匹配:?:

?:常宇或選擇符|搭配,用來(lái)匹配類(lèi)似a(?:b|c) 可以匹配ab或ac,詳情見(jiàn)非正則匹配詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容