【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)
console.log(/foo.bar/.test('foo\nbar')) // false
console.log(/foo.bar/s.test('foo\nbar')) // true
在 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 间接说明没有定义命名捕获分组。那什么是命名捕获分组呢?
console.log('2020-05-01'.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/))
这段代码的返回值 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扩展相关推荐
- 【ES9(2018)】String 扩展 标签模板里字符串转义
放松对标签模板里字符串转义的限制, 遇到不合法的字符串转义返回undefined,并且从raw上可获取原字符串. ES9开始,模板字符串允许嵌套支持常见转义序列,移除对ECMAScript在带标签的模 ...
- 【ES9(2018)】Object Rest Spread
前面讲到 function 的 rest剩余参数和spread扩展运算符,ES9中新增Object的 Rest & Spread 方法: const input = {a: 1,b: 2 }c ...
- 【ES9(2018)】for await...of
for...of循环用于遍历同步的Iterator接口.新引入的for await...of循环,则是用于遍历异步的Iterator接口. 先来看下for...of的效果: function Gen( ...
- 【ES9(2018)】Promise.prototype.finally()
指定不管最后状态如何都会执行的回调函数. Promise.prototype.finally() 方法返回一个Promise,在promise执行结束时,无论结果是fulfilled或者是reject ...
- ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14(ES进阶之路二)
简介 JavaScript是世界上发展最快的编程语言之一,不仅可以用于编写运行在浏览器的客户端程序,随着Node.js的发展,JavaScript也被广泛应用于编写服务端程序.而随着JavaScrip ...
- 正则表达式中grep,sed的用法(包括基本的正则表达式和扩展的正则表达式)
一 正则表达式 Basic REGEXP:基本正则表达式 Extended REGEXP:扩展正则表达式 (正则表达式是使得计算机变成智能化的重要途径) 1.1 基本正则表达式 . : 表示匹配任 ...
- JavaScript(入门)
文章目录 一.JavaScript基本概念和作用 二.JavaScript的引入方式 三.JavaScript基础语法 1.变量 2.数据类型 2.1 基本数据类型 2.1.1 Number 2.1. ...
- spread_通过Rest and Spread实现JavaScript的现代化
spread Exploring two recent features that will make your code cleaner and more robust 探索两项最新功能,这些功能将 ...
- 姚班三兄弟3万块创业八年,旷视终冲刺港股
作者 | 余洋洋 杨健楷 编辑 | 张丽娟 来源 | CV智识(ID:CVAI2019) 旷视此次 IPO 或将成为整个 AI 行业的信号,不只是" 四小龙"的另外三家--商汤.依 ...
最新文章
- 实验二:网络嗅探与欺骗
- Linux下的Nano命令
- Python爬虫入门教程 1-100 CentOS环境安装
- MySQL单表多字段模糊查询
- VTK:Utilities之ColorTransferFunction
- Spring Cloud Hoxton正式发布,Spring Boot 2.2 不再孤单
- 大数据技术周报第 007 期
- 每年都有人问“IT行业还能再火几年”,现实给出最好的答案
- nodejs+express开发blog(2)
- 微信小程序,模板+按钮+绑定事件
- 书籍分享——《创新者的窘境》
- 判断回文字符串-C语言
- 邮件客户端里的网络设置
- 老人与海好词100英文带翻译_老人与海优美段落英文,英文的优美句子,带翻译,越多越好,谢谢...
- Incremental Learning of Object Detectors without Catastrophic Forgetting详解
- 你知道哪些冷门但逆天的 App?
- ZYNQ PS端模块读书笔记-中断
- Java中获取当前时间
- “一52岁程序员老将”,看完这“208道精品面试题”;最终成功跳槽阿里P8,从此平步青云,飞黄腾达
- PPTV网络电视 3.1.9.0042官方正式版下载 (原PPLive)