摘要:年,添加了對正則表達式的支持。這篇博客將介紹正則表達式的最新特性模式選項斷言規范遺留特性模式選項這個特性已經在正式發布了。參考阮一峰入門博客正則表達式進階指南關于專注于微信小程序微信小游戲支付寶小程序和實時監控。
譯者按: 還沒學好ES6?ECMAScript 2018已經到來啦!
原文:ECMAScript regular expressions are getting better!
作者: Mathias Bynens: Google V8引擎開發者
譯者:Fundebug
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。
1999年,ECMAScript 3添加了對正則表達式的支持。
16年之后,ECMAScript 6(即ECMAScript 2015或者ES6)引入了Unicode模式(u選項), sticky模式(y選項)以及RegExp.prototype.flags的getter方法。
這篇博客將介紹ECMAScript正則表達式的最新特性:
dotAll模式(s選項)
Lookbehind斷言
Named capture groups
Unicode property escapes
String.prototype.matchAll
規范RegExp遺留特性
1. dotAll模式(s選項)這個特性已經在ECMAScript 2018正式發布了。
默認情況下,.可以匹配任意字符,除了換行符:
/foo.bar/u.test("foo bar"); // false
另外,.不能匹配Unicode字符,需要使用u選項啟用Unicode模式才行。
ES2018引入了dotAll模式,通過s選項可以啟用,這樣,.就可以匹配換行符了。
/foo.bar/su.test("foo bar"); // true2. Lookbehind斷言
這個特性已經在ECMAScript 2018正式發布了。
ECMAScript目前僅支持lookahead斷言。
下面示例是Positive lookahead,匹配字符串“42 dollars”中緊跟著是"dollars"的數字:
const pattern = /d+(?= dollars)/u; const result = pattern.exec("42 dollars"); console.log(result[0]); // 打印42
下面示例是Negative lookahead,匹配字符串“42 pesos”中緊跟著的不是"dollars"的數字:
const pattern = /d+(?! dollars)/u; const result = pattern.exec("42 pesos"); console.log(result[0]); // 打印42
ES2018添加了lookbehind斷言。
下面示例是Positive lookbehind,匹配字符串“$42”中前面是"$"的數字:
const pattern = /(?<=$)d+/u; const result = pattern.exec("$42"); console.log(result[0]); // 打印42
下面示例是Negative lookbehind,匹配字符串“$42”中前面不是是"$"的數字:
const pattern = /(?Fundebug專注于網頁、微信小程序、微信小游戲,支付寶小程序,React Native,Node.js和Java線上BUG實時監控,歡迎免費試用
3. Named capture groups這個特性已經在ECMAScript 2018正式發布了。目前,正則表達式中小括號匹配的分組是通過數字編號的:
const pattern = /(d{4})-(d{2})-(d{2})/u; const result = pattern.exec("2017-01-25"); console.log(result[0]); // 打印"2017-01-25" console.log(result[1]); // 打印"2017" console.log(result[2]); // 打印"01" console.log(result[3]); // 打印"25"這樣很方便,但是可讀性很差,且不易維護。一旦正則表達式中小括號的順序有變化時,我們就需要更新對應的數字編號。
ES2018添加named capture groups, 可以指定小括號中匹配內容的名稱,這樣可以提高代碼的可讀性,也便于維護。
const pattern = /(?4. Unicode property escapesd{4})-(? d{2})-(? d{2})/u; const result = pattern.exec("2017-01-25"); console.log(result.groups.year); // 打印"2017" console.log(result.groups.month); // 打印"01" console.log(result.groups.day); // 打印"25" 這個特性已經在ECMAScript 2018正式發布了。Unicode標準為每一個字符分配了多個屬性。比如,當你要匹配希臘語字符時,則可以搜索Script_Extensions屬性為Greek的字符。
Unicode property escapes使得我們可以使用ECMAScript正則表達式直接匹配Unicode字符的屬性:
const regexGreekSymbol = /p{Script_Extensions=Greek}/u; console.log(regexGreekSymbol.test("π")); // 打印true5. String.prototype.matchAll這個特性還處在Stage 3 Draftg和y選項通常用于匹配一個字符串,然后遍歷所有匹配的子串,包括小括號匹配的分組。String.prototype.matchAll讓這個操作變得更加簡單了。
const string = "Magic hex numbers: DEADBEEF CAFE 8BADF00D"; const regex = /[0-9a-fA-F]+/g; for (const match of string.matchAll(regex)) { console.log(match); }每一個迭代所返回的match對象與regex.exec(string)所返回的結果相同:
// Iteration 1: [ "DEADBEEF", index: 19, input: "Magic hex numbers: DEADBEEF CAFE 8BADF00D" ] // Iteration 2: [ "CAFE", index: 28, input: "Magic hex numbers: DEADBEEF CAFE 8BADF00D" ] // Iteration 3: [ "8BADF00D", index: 33, input: "Magic hex numbers: DEADBEEF CAFE 8BADF00D" ]注意,這個特性還處在Stage 3 Draft,因此還存在變化的可能性,示例代碼是根據最新的提案寫的。另外,瀏覽器也還沒有支持這個特性。String.prototype.matchAll最快可以被加入到ECMAScript 2019中。
6. 規范RegExp遺留特性這個提案還處在Stage 3 Draft這個提案規范了RegExp的遺留特性,比如RegExp.prototype.compile方法以及它的靜態屬性從RegExp.$1到RegExp.$9。雖然這些特性已經棄用(deprecated)了,但是為了兼容性我們不能將他們去。因此,規范這些RegExp遺留特性是最好的方法。因此,這個提案有助于保證兼容性。
參考阮一峰 - ECMAScript 6 入門
Fundebug博客 - JavaScript正則表達式進階指南
ECMAScript 2018: the final feature set
關于FundebugFundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,得到了Google、360、金山軟件等眾多知名用戶的認可。歡迎免費試用!
版權聲明轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/08/30/ecmascript-regular-expression-new-features/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97172.html
摘要:隨后,它出現在公司之后的瀏覽器,以及從微軟從起發布的所有瀏覽器上。標準的第版在年月的大會上被表決接受。第版在年月底大會上被采納。 前言 ??本系列譯文的初衷旨在希望更多人能夠了解關于JS的一些基本概念,遇到原理性的問題時多去翻翻文檔,而不是在社區無休止的重復提出某些在文檔中能夠非常方便快捷就能找到的東西。 ??精力和水平有限,所以暫時只打算嘗試翻譯前面幾章概括性的介紹,同時后面的章節大...
摘要:返回一個由原數組中的每個元素調用一個指定方法后的返回值組成的新數組。方法測試數組中的某些元素是否通過了指定函數的測試,返回值非常實用的功能,判斷數組中是否某元素符合特定條件。 ECMAScript 5發布于2009年12月。ECMAscript 5.1版(下文稱ES5)發布于2011年6月,,并且成為ISO國際標準(ISO/IEC 16262:2011) http://www.ecma...
摘要:返回一個由原數組中的每個元素調用一個指定方法后的返回值組成的新數組。方法測試數組中的某些元素是否通過了指定函數的測試,返回值非常實用的功能,判斷數組中是否某元素符合特定條件。 ECMAScript 5發布于2009年12月。ECMAscript 5.1版(下文稱ES5)發布于2011年6月,,并且成為ISO國際標準(ISO/IEC 16262:2011) http://www.ecma...
摘要:第二個參數指定修飾符,如果存在則使用指定的修飾符。屬性表示是否設置了修飾符屬性的屬性返回正則表達式的正文的屬性返回正則表達式的修飾符字符串必須轉義,才能作為正則模式。 1 RegExp構造函數 ES6 允許RegExp構造函數接受正則表達式作為參數。第二個參數指定修飾符,如果存在則使用指定的修飾符。 var regexp = new RegExp(/xyz/i, ig); consol...
摘要:定期召開會議,會議由會員公司的代表與特邀專家出席。新版本將會包含每年截止時間之前完成的所有特性。它引入了一個新的構造函數和具有輔助函數的命名空間對象。 導言:ECMAScript的演化不會停止,但是我們完全沒必要害怕。除了ES6這個史無前例的版本帶來了海量的信息和知識點以外,之后每年一發的版本都僅僅帶有少量的增量更新,一年更新的東西花半個小時就能搞懂了,完全沒必要畏懼。本文將帶您花大約...
閱讀 3708·2021-10-18 13:34
閱讀 2396·2021-08-11 11:15
閱讀 1201·2019-08-30 15:44
閱讀 687·2019-08-26 10:32
閱讀 986·2019-08-26 10:13
閱讀 2065·2019-08-23 18:36
閱讀 1775·2019-08-23 18:35
閱讀 523·2019-08-23 17:10