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