W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
我們不僅可以在結(jié)果或替換字符串中使用捕獲組 ?(...)
? 的內(nèi)容,還可以在模式本身中使用它們。
可以使用 \N
在模式中引用一個組,其中 N
是組號。
為了弄清這有什么用,讓我們考慮一個任務(wù)。
我們需要找到帶引號的字符串:單引號 '...'
或雙引號 "..."
—— 應(yīng)匹配這兩種變體。
如何找到它們?
我們可以將兩種引號都放在方括號中:['"](.*?)['"]
,但它會找到帶有混合引號的字符串,例如 "...'
和 '..."
。當(dāng)一種引號出現(xiàn)在另一種引號內(nèi),比如在字符串 "She's the one!"
中時,便會導(dǎo)致不正確的匹配:
let str = `He said: "She's the one!".`;
let regexp = /['"](.*?)['"]/g;
// 不是我們想要的結(jié)果
alert( str.match(regexp) ); // "She'
正如我們所看到的,該模式找到了一個開頭的引號 "
,然后文本被匹配,直到另一個引號 '
,該匹配結(jié)束。
為了確保模式查找的結(jié)束引號與開始的引號完全相同,我們可以將其包裝到捕獲組中并對其進(jìn)行反向引用:(['"])(.*?)\1
。
這是正確的代碼:
let str = `He said: "She's the one!".`;
let regexp = /(['"])(.*?)\1/g;
alert( str.match(regexp) ); // "She's the one!"
現(xiàn)在可以了!正則表達(dá)式引擎會找到第一個引號 (['"])
并記住其內(nèi)容。那是第一個捕獲組。
在模式中 \1
表示“找到與第一組相同的文本”,在我們的示例中為完全相同的引號。
與此類似,\2
表示第二組的內(nèi)容,\3
—— 第三分組,依此類推。
請注意:
如果我們在捕獲組中使用
?:
,那么我們將無法引用它。用(?:...)
捕獲的組被排除,引擎不會記住它。
不要搞混了:在模式中用 ?
\1
?,在替換項(xiàng)中用:?$1
?在替換字符串中我們使用美元符號:
$1
,而在模式中 —— 使用反斜杠\1
。
如果一個正則表達(dá)式中有很多括號,給它們起個名字會便于引用。
要引用命名的捕獲組,我們可以使用:\k<name>
。
在下面的示例中,帶引號的組被命名為 ?<quote>
,因此反向引用為 \k<quote>
:
let str = `He said: "She's the one!".`;
let regexp = /(?<quote>['"])(.*?)\k<quote>/g;
alert( str.match(regexp) ); // "She's the one!"
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: