文章目录

  • 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扩展相关推荐

  1. 【ES9(2018)】String 扩展 标签模板里字符串转义

    放松对标签模板里字符串转义的限制, 遇到不合法的字符串转义返回undefined,并且从raw上可获取原字符串. ES9开始,模板字符串允许嵌套支持常见转义序列,移除对ECMAScript在带标签的模 ...

  2. 【ES9(2018)】Object Rest Spread

    前面讲到 function 的 rest剩余参数和spread扩展运算符,ES9中新增Object的 Rest & Spread 方法: const input = {a: 1,b: 2 }c ...

  3. 【ES9(2018)】for await...of

    for...of循环用于遍历同步的Iterator接口.新引入的for await...of循环,则是用于遍历异步的Iterator接口. 先来看下for...of的效果: function Gen( ...

  4. 【ES9(2018)】Promise.prototype.finally()

    指定不管最后状态如何都会执行的回调函数. Promise.prototype.finally() 方法返回一个Promise,在promise执行结束时,无论结果是fulfilled或者是reject ...

  5. ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14(ES进阶之路二)

    简介 JavaScript是世界上发展最快的编程语言之一,不仅可以用于编写运行在浏览器的客户端程序,随着Node.js的发展,JavaScript也被广泛应用于编写服务端程序.而随着JavaScrip ...

  6. 正则表达式中grep,sed的用法(包括基本的正则表达式和扩展的正则表达式)

    一 正则表达式   Basic REGEXP:基本正则表达式 Extended REGEXP:扩展正则表达式 (正则表达式是使得计算机变成智能化的重要途径) 1.1 基本正则表达式 . : 表示匹配任 ...

  7. JavaScript(入门)

    文章目录 一.JavaScript基本概念和作用 二.JavaScript的引入方式 三.JavaScript基础语法 1.变量 2.数据类型 2.1 基本数据类型 2.1.1 Number 2.1. ...

  8. spread_通过Rest and Spread实现JavaScript的现代化

    spread Exploring two recent features that will make your code cleaner and more robust 探索两项最新功能,这些功能将 ...

  9. 姚班三兄弟3万块创业八年,旷视终冲刺港股

    作者 | 余洋洋 杨健楷 编辑 | 张丽娟 来源 | CV智识(ID:CVAI2019) 旷视此次 IPO 或将成为整个 AI 行业的信号,不只是" 四小龙"的另外三家--商汤.依 ...

最新文章

  1. 实验二:网络嗅探与欺骗
  2. Linux下的Nano命令
  3. Python爬虫入门教程 1-100 CentOS环境安装
  4. MySQL单表多字段模糊查询
  5. VTK:Utilities之ColorTransferFunction
  6. Spring Cloud Hoxton正式发布,Spring Boot 2.2 不再孤单
  7. 大数据技术周报第 007 期
  8. 每年都有人问“IT行业还能再火几年”,现实给出最好的答案
  9. nodejs+express开发blog(2)
  10. 微信小程序,模板+按钮+绑定事件
  11. 书籍分享——《创新者的窘境》
  12. 判断回文字符串-C语言
  13. 邮件客户端里的网络设置
  14. 老人与海好词100英文带翻译_老人与海优美段落英文,英文的优美句子,带翻译,越多越好,谢谢...
  15. Incremental Learning of Object Detectors without Catastrophic Forgetting详解
  16. 你知道哪些冷门但逆天的 App?
  17. ZYNQ PS端模块读书笔记-中断
  18. Java中获取当前时间
  19. “一52岁程序员老将”,看完这“208道精品面试题”;最终成功跳槽阿里P8,从此平步青云,飞黄腾达
  20. PPTV网络电视 3.1.9.0042官方正式版下载 (原PPLive)

热门文章

  1. MediaProxy的Web监控界面及多Relay情景配置
  2. 《深度学习:Java语言实现》一一1.3人工智能与深度学习
  3. Indent Guides for Visual Studio 代码格式化收缩插件
  4. 自定义控件 一 创建最简单的控件
  5. silverlight开发无法调试问题
  6. 腾讯二面,我被 “赛马” 问题难住了
  7. 程序员平均月薪过万,想当程序员的话,大学学那些专业会更好呢?
  8. 程序员日记我们需要有条理的生活
  9. 准备刺第一针了(飞秋官方下载)
  10. 飞鸽传书2008一种重要心态