【ES9(2018)】RegExp扩展
文章目錄
- 1. dotAll 模式
- 2. 具名組匹配
- 3. 后行斷言
1. dotAll 模式
正則表達(dá)式中,點(diǎn)(.)是一個(gè)特殊字符,代表任意的單個(gè)字符,但是有兩個(gè)例外。一個(gè)是四個(gè)字節(jié)的 UTF-16 字符,這個(gè)可以用u修飾符解決;另一個(gè)是行終止符(line terminator character)。
- U+000A 換行符(\n)
- U+000D 回車(chē)符(\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那如何判斷當(dāng)前正則是否使用了 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. 具名組匹配
我們?cè)趯?xiě)正則表達(dá)式的時(shí)候,可以把一部分用()包裹起來(lái),被包裹起來(lái)的這部分稱(chēng)作“分組捕獲”。
console.log('2020-05-01'.match(/(\d{4})-(\d{2})-(\d{2})/)) // ["2020-05-01","2020","05","01"]這個(gè)正則匹配很簡(jiǎn)單,按照 match 的語(yǔ)法,沒(méi)有使用 g 標(biāo)識(shí)符,所以返回值第一個(gè)數(shù)值是正則表達(dá)式的完整匹配,接下來(lái)的第二個(gè)值到第四個(gè)值是分組匹配(2020, 05, 01)。
此外 match 返回值還有幾個(gè)屬性,分別是 index、input、groups。
- index 匹配的結(jié)果的開(kāi)始位置
- input 搜索的字符串
- group 一個(gè)捕獲組數(shù)組 或 undefined(如果沒(méi)有定義命名捕獲組)
我們通過(guò)數(shù)組來(lái)獲取這些捕獲:
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
上文中重點(diǎn)看下 groups 的解釋,這里提到了命名捕獲組的概念,如果沒(méi)有定義 groups 就是 undefined。很明顯,我們上述的返回值就是 `undefined 間接說(shuō)明沒(méi)有定義命名捕獲分組。那什么是命名捕獲分組呢?
這段代碼的返回值 groups 已經(jīng)是 Object 了,這個(gè) Object 的 key 就是正則表達(dá)式中定義的,也就是把捕獲分組進(jìn)行了命名。
3. 后行斷言
在 ES9 之前 JavaScript 正則只支持先行斷言,不支持后行斷言。簡(jiǎn)單復(fù)習(xí)下先行斷言的知識(shí):
let test = 'hello world' console.log(test.match(/hello(?=\sworld)/)) // ["hello", index: 0, input: "hello world", groups: undefined]這段代碼要匹配后面是 world 的 hello,但是反過(guò)來(lái)就不成:
let test = 'world hello' console.log(test.match(/hello(?=\sworld)/)) // null比如我們想判斷前面是 world 的 hello,這個(gè)代碼是實(shí)現(xiàn)不了的。在 ES9 就支持這個(gè)后行斷言了:
let test = 'world hello' console.log(test.match(/(?<=world\s)hello/)) // ["hello", index: 6, input: "world hello", groups: undefined](?<...)是后行斷言的符號(hào),(?...)是先行斷言的符號(hào),然后結(jié)合 =(等于)、!(不等)、\1(捕獲匹配)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【ES9(2018)】RegExp扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Vue第二部分(4): 嵌套路由和路由传
- 下一篇: 电脑硬件知识学习_电脑故障小知识自己动手