【ES9(2018)】RegExp扩展
文章目錄
- 1. dotAll 模式
- 2. 具名組匹配
- 3. 后行斷言
1. dotAll 模式
正則表達式中,點(.)是一個特殊字符,代表任意的單個字符,但是有兩個例外。一個是四個字節的 UTF-16 字符,這個可以用u修飾符解決;另一個是行終止符(line terminator character)。
- U+000A 換行符(\n)
- U+000D 回車符(\r)
- U+2028 行分隔符(line separator)
- U+2029 段分隔符(paragraph separator)
在 ES5 中我們都是這么解決的:
console.log(/foo[^]bar/.test('foo\nbar')) // true // or console.log(/foo[\s\S]bar/.test('foo\nbar')) // true那如何判斷當前正則是否使用了 dotAll 模式呢?
const re = /foo.bar/s // Or, `const re = new RegExp('foo.bar', 's')` . console.log(re.test('foo\nbar')) // true console.log(re.dotAll) // true console.log(re.flags) // 's'2. 具名組匹配
我們在寫正則表達式的時候,可以把一部分用()包裹起來,被包裹起來的這部分稱作“分組捕獲”。
console.log('2020-05-01'.match(/(\d{4})-(\d{2})-(\d{2})/)) // ["2020-05-01","2020","05","01"]這個正則匹配很簡單,按照 match 的語法,沒有使用 g 標識符,所以返回值第一個數值是正則表達式的完整匹配,接下來的第二個值到第四個值是分組匹配(2020, 05, 01)。
此外 match 返回值還有幾個屬性,分別是 index、input、groups。
- index 匹配的結果的開始位置
- input 搜索的字符串
- group 一個捕獲組數組 或 undefined(如果沒有定義命名捕獲組)
我們通過數組來獲取這些捕獲:
let t = '2020-05-01'.match(/(\d{4})-(\d{2})-(\d{2})/) console.log(t[1]) // 2020 console.log(t[2]) // 05 console.log(t[3]) // 01
上文中重點看下 groups 的解釋,這里提到了命名捕獲組的概念,如果沒有定義 groups 就是 undefined。很明顯,我們上述的返回值就是 `undefined 間接說明沒有定義命名捕獲分組。那什么是命名捕獲分組呢?
這段代碼的返回值 groups 已經是 Object 了,這個 Object 的 key 就是正則表達式中定義的,也就是把捕獲分組進行了命名。
3. 后行斷言
在 ES9 之前 JavaScript 正則只支持先行斷言,不支持后行斷言。簡單復習下先行斷言的知識:
let test = 'hello world' console.log(test.match(/hello(?=\sworld)/)) // ["hello", index: 0, input: "hello world", groups: undefined]這段代碼要匹配后面是 world 的 hello,但是反過來就不成:
let test = 'world hello' console.log(test.match(/hello(?=\sworld)/)) // null比如我們想判斷前面是 world 的 hello,這個代碼是實現不了的。在 ES9 就支持這個后行斷言了:
let test = 'world hello' console.log(test.match(/(?<=world\s)hello/)) // ["hello", index: 6, input: "world hello", groups: undefined](?<...)是后行斷言的符號,(?...)是先行斷言的符號,然后結合 =(等于)、!(不等)、\1(捕獲匹配)。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【ES9(2018)】RegExp扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue第二部分(4): 嵌套路由和路由传
- 下一篇: 人工智能python课程总结1500字_