簡體   English   中英

正則表達式中的$ 0和$ 1

[英]$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM