ES2018正則表達式更新


如果你是一個初學者,這篇文章可以拓展你對正則表達式用法的理解,不過建議你先閱讀一些正則表達式入門文章,比如經典的《正則表達式30分鍾入門教程》。如果你對正則表達式有一定的認識,那么這篇文章可以讓你了解JavaScript中的新功能。

隨着ES2018的更新,JavaScript正則表達式和其他基於PCRE的正則表達式引擎之間的差距越來越小。

ES2018有以下四個比較重要的更新:

  1. Lookbehinds
  2. 捕獲分組命名
  3. 元字符.匹配換行符
  4. Unicode轉義

Lookbehinds斷言

(?<=exp)也叫零寬度正回顧后發斷言,它斷言自身出現的位置的前面能匹配表達式exp

/(?<=a)b/  // 匹配字符串b,字符串b前面是字符串a,字符串a不包含在匹配結果內

(?<!exp) 零寬度負回顧后發斷言,斷言此位置的前面不能匹配表達式exp

/(?<!a)b/  // 匹配字符串b,字符串b前面不是字符串a

你會發現在上面兩個示例都沒有捕獲分組。如要需要捕獲分組,可以在要捕獲的表達式周圍添加括號:

在此表達式中,生成的正則表達式匹配對象包含索引1下的捕獲字符a

groups屬性仍是空的,這就是接下來要說的

 捕獲分組命名

/(?<name>content)/  // 語法:匹配content並捕獲分組,分組命名為name

為了創建一個命名的捕獲分組,我們所需要做的就是在括號開始后寫一個問號,然后在左右尖括號之間寫入捕獲的分組名稱。

示例:匹配出字符串“Price: $19.00”中的貨幣和價格並分別對分組命名

console.table( 
    /^Price: (?<currency>\$)(?<numPrice>\d+\.\d+)$/
       .exec('Price: $15.99')
       .groups 
)

貨幣分組名稱:currency,價格分組名稱numPrice

你仍然可以使用數字索引來引用捕獲的分組,如果你訪問groups屬性,則可以讀取自定義分組名稱來獲取對應的值

自動分組正則表達式反向引用語法:一個反斜杠加分組號,如\1,自定義分組反向引用語法則是:\k<groupName>,命名的捕獲組使你的表達式更易於維護

在String.prototype.replace中使用自動命名組:
const str = 'abc123';
str.replace(/([a-z]+)(\d+)/, '$2$1')
// 123abc

 

在String.prototype.replace中使用自定義命名組:
const str = 'abc123';
str.replace(/(?<name1>[a-z]+)(?<name2>\d+)/, '$<name2>$<name1>')
// 123abc

 

元字符.匹配換行符

這是一個非常簡單的更新。正如您可能知道的那樣,在JavaScript正則表達式以及許多PCRE正則表達式中,元字符.不匹配換行符\n

/./.test('\n')
    // false

我們測試時可以看到返回false。

在ES2018中,我們可以添加一個s標志,以使點匹配換行符

/./s.test('\n')
    // true

確切地說,還有其他行終止符,例如回車符\r,或行分隔符和段落分隔符,它們分別是U+2028U+2029

Unicode轉義

這是一個文檔繁重的主題,因為文檔本身詳細介紹了此更新的每個細節。我將鏈接到文檔作為參考。該文檔詳細介紹了如何將某些unicode字符組與某些表達式匹配,而不使用任何第三方庫。

在本節中,我們將集中討論此更新的一些實際用例,而不是對每個unicode組的詳細描述。

我們從演示開始。假設你想匹配希臘字符。在我們決定不使用任何第三方庫的情況下,我們在ES2018之前是如何做到的?

沒錯,我們不得不創建字符集。

/[θωερτψυιοπασδφγηςκλζχξωβνμάέήίϊΐόύϋΰώ]/u.test('λ')
    // true

還要考慮大寫

/[ΘΩΕΡΤΨΥΙΟΠΑΣΔΦΓΗςΚΛΖΧΞΩΒΝΜΆΈΉΊΪΐΌΎΫΰΏ]/u.test('Λ')
    //true

在ES2018中,我們有一個更簡單的符號:

/\p{Script=Greek}/u.test('π');
    // true

\p{Script=Greek}只匹配希臘字符,這是一個很好的語義簡寫。希臘字符的數量有限,非常像英語。同時,如果沒有Unicode轉義,要匹配中文或日文,你必須在那里寫一大堆符號。這個問題通過Unicode轉義解決。

如果您需要克服JavaScript正則表達式的一些缺點,我仍然鼓勵您使用xRegExp庫。事實上,JavaScript正則表達式引擎並不會那么快取代xRegExp。與此同時,ES2018正則表達式引擎比之前變得更好,更易維護。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM