[英]$0 and $1 in Regular Expression
我正在嘗試使用帶有正則表達式的replace,並且需要一些幫助來理解$ 1在此代碼中的含義。 這段代碼是用來交換大小寫的。
return str.replace(/([a-z])|([A-Z])/g,
function($0, $1)
{ return ($1) ? $0.toUpperCase() : $0.toLowerCase(); })
我知道在replace方法的第一個參數中,我會檢查我們是否具有小寫或大寫字母,但是我不明白具有第二個參數的方式和作用。
我理解如果($ 1)為true的語法,我們執行$ 0.toUpperCase(),否則執行$ 0.toLowerCase()。 但是,如何從($ 1)為真來決定呢? ($ 1)有什么條件? 我想我明白$ 0是整個匹配的字符串。 但是我對($ 1)感到困惑。 謝謝!
($ 1)有什么條件?
無-正則表達式語法沒有指定如何評估匹配組的真實性,因此這取決於所包含語言的行為。
我猜想,在這種情況下,它會將空字符串評估為假,將非空字符串評估為真-但由於您沒有告訴我們這是什么語言,因此無法確定。
$0
確實是整個匹配的字符串。 $1
是第一個子模式(即小寫字母)。 如果第一個子模式匹配,則將其大寫,否則將其小寫。 應該注意的是,該函數被賦予了另一個參數,但是在這種情況下不使用它。
注意傳遞給評估器的參數 。 按照給定的模式,我將其重寫為:
str.replace(/([a-z])|([A-Z])/g,
function(match, p1, p2) {
return p1 ? p1.toUpperCase() : p2.toLowerCase();
})
如果([az])
匹配,則綁定的p1
( $1
)變量將求值為真字符串(任何不為空的字符串;特別是正則表達式接受的字符串); 否則, p1
將為空字符串""
(這是一個偽造的值)。 這就是為什么對p1
( $1
)的檢查正確的原因-請注意,綁定的捕獲組始終具有字符串類型。
請注意,您沒有必要檢查match
( $0
),因為它永遠不會是什么,而是帶有正則表達式的真實(它將是第一個或第二個替換子表達式)。
在此示例中,$ 0和$ 1只是變量(使用匈牙利符號表示)。 您可以輕松地用a和b替換它們,並且代碼的工作原理相同。 該函數用許多參數調用。 第一個參數是匹配的子字符串。 第二個參數是第一個捕獲(與第一個括號中的正則表達式匹配的任何字符,在這種情況下為單個小寫字母az)。 第三個(丟失)參數將是第二個捕獲(匹配大寫字母AZ),但請注意,此參數將被忽略。
因為正則表達式使用全局“ g”標志,所以該函數(可能)多次調用。 正則表達式匹配任何小寫或大寫字母。 第一個功能參數將從str開始連續匹配每個字符,而第二個參數僅在第一個捕獲組匹配時設置-這意味着第二個功能參數僅在字符為小寫時設置 。 如果設置了第二個參數(即,這是一個小寫字符),則在匹配項上調用toUpperCase函數。 如果未設置第二個參數(即,這是一個大寫字符),則在匹配項上調用toLowerCase函數。 在后一種情況下,未使用的第三參數將包含第二捕獲組內容。
整個解決方案具有逐個字符交換大小寫的效果。
但是..在此代碼中使用$ 0和$ 1意味着創建者在玩弄其他東西:引用和反向引用。 $ 0(或某些語言中的\\ 0)是對匹配項的引用(即,它恰好是該函數的第一個參數),$ 1(或\\ 1)是對第一個捕獲組的引用,以此類推。如此命名變量以支持第一個參數等效於$ 0,第二個參數等效於$ 1的概念,依此類推。在我看來,這是開明的,並且完全令人困惑。 這些變量名的使用表明發生了一些不可思議的事情。 匈牙利表示法的使用還意味着其他含義。 這里沒有什么魔術,因此變量應該更簡單地命名-match和is_lowercase會很好。
此外,由於缺少第三個函數自變量,因此無需捕獲大寫字符類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.