Javascript 模式中的反向引用:\N 和 \k<name>

2023-02-17 11:02 更新

我們不僅可以在結(jié)果或替換字符串中使用捕獲組 ?(...)? 的內(nèi)容,還可以在模式本身中使用它們。

按編號(hào)反向引用:\N

可以使用 \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。

按命名反向引用:\k<name>

如果一個(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!"


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)