正则的扩展

1. RegExp 构造函数

ES5RegExp 构造函数的两种用法:

  1. 第一个参数是字符串,第二个参数是正则表达式的修饰符
var regexp = new RegExp('xyz', 'g');
// 等价于
var regexp = /xyz/g;
  1. 只有一个参数,参数是一个正则表达式,修饰符包含在这个正则表达式中,不允许出现第二个参数,否则会报错。
var regexp = new RegExp(/xyz/g);
// 等价于
var regexp = /xyz/g;

// 下面这种情况会报错
var regexp = new (/xyz/g, 'i'); // ES5中当第一个参数是正则表达式时不允许出现第二个参数

ES6 解决了这个问题,而且第二个参数指定的修饰符会覆盖掉第一个参数中的修饰符。

var regexp =new RegExp(/xyz/ig, 'i');
regexp.flags // 'i'

注意:第二个参数中的修饰符是一个字符(字符串),要用引号引起来。以修饰符 i 为例,若是不用引号引起来,那 i 不就表示一个变量了吗?

2. 字符串的正则方法

字符串对象可以使用正则表达式的四个方法:

  1. match()
  2. replace()
  3. split()
  4. search()

ES6 使这4个方法在语言内部全部调用 RegExp 实例方法,从而做到所有与正则相关的方法都定义在 RegExp 对象上。

String.prototype.match 调用 RegExp.prototype[symbol.match]

3. u 修饰符

ES6 对正则表达式新添加了 u 修饰符,用来处理码点大于 \uFFFF 的字符。记住 u 修饰符的作用就是以前不能处理码点大于 \uFFFF 的字符,现在可以了。

下面举例说明加上 u 修饰符后带来了哪些改变:

  1. 测试匹配结果发生变化
/^\uD842/u.test('\uD842\uDFB7'); // false
/^\uD842/.test('\uD842\uDFB7'); // true

'\uD842\uDFB7' 是一个四字节 UTF-16 编码,代表字符 '?',若不加 u 修饰符,那么会将其当作两个字 符,第一个字符为 '\uD842' 故会返回 true ,加上 u 修饰符之后就会将其识别为一个字符,不会和 \uD842 匹配,故会返回 false

  1. 点字符

    点字符(.) 在正则表达式中的含义是除换行符之外的任意单个字符。

    当码点大于 \uFFFF 时,点字符无法正确识别,当加上 u 修饰符时,点字符就可以识别了。

var s = '?';
/^.$/.test(s); // false
/^.$/u.test(s); // true
  1. Unicode 字符表示

    字符串的扩展(ES6)1. 字符的Unicode表示法一节中我们知道,ES6 新增了了使用大括号来表示 Unicode 字符的表示法,'\u{20BB7}' 表示 '?'

    但是在正则表达式中,要想使用大括号表示 Unicode 字符,必须加上 u 修饰符,否则会被解读为量词。

/\u{61}/.test('a'); // false,不加u修饰符,会被认为连续匹配61个u字符
/\u{61}/u.test('a'); // true
  1. 量词

    不使用 u 修饰符 使用 u 修饰符
    只能识别码点小于 \uFFFF 的字符 可以识别码点大于 \uFFFF 的字符
  2. i 修饰符

    有些 Unicode 字符的编码不同,但是字型是相近或相同的,比如, \u004B\u212A 都是大写的 'K'。字符有规范和不规范一说,不使用 u 修饰符就不能识别非规范的 Unicode 字符。

/[a-z]/i.test('\u212A'); // false
/[a-z]/iu.test('\u212A'); // true

​ 如果不加 u 修饰符就不能识别出非规范的 K 字符,出现遗漏等情况。

4. y 修饰符

y 修饰符的作用与 g 修饰符的作用类似,都是全局匹配,但是 g 修饰符只要在剩余位置下存在匹配就行,而 y 修饰符必须要从剩余的第一个位置开始匹配,也就是暗含头部匹配的条件。

y 修饰符又叫“粘连”修饰符

var s = "aaa_aa_a";
var r1 = /a+/g;
var r2 = /a+/y;

r1.exec(s); // ["aaa"], lastIndex=3
r2.exec(s); // ["aaa"], lastIndex=3

r1.exec(s); // ["aa"], 从"aaa_aa_a"中第4个位置"_"开始匹配,由于是g,故可以匹配到"aa".
r2.exec(s); // null, 从"aaa_aa_a"中第4个位置"_"开始匹配,由于是y暗含头部匹配,所以必须从开始的第一个  // 位置就要匹配上,但是开始匹配的第一个位置是"_",所以匹配不上。

5. sticky 属性

只读布尔值,表示是否设置了y修饰符

6. flags 属性

返回正则表达式的修饰符 /abc/ig.flags // 'gi'

7. s 修饰符:dotAll 模式

使 '.' 修饰符可以匹配任意一个字符

8. 后行断言

字符 含义
(?<=p)(提案) 后行断言,要求前面的字符要与p匹配,并且匹配的结果中不包含p,如 var result = /(?<=\$)\d+/.exec('$100*80'); // result=['100']
(?<!p) 后行否定断言,要求前面的字符不能与p匹配,并且匹配结果中不包含p,如 var result= /(?!\$)\d+/.exec('$100*80'); // result=['80']

9. 具名组匹配

字符 含义
(?<name>)(提案) 具名组 格式:“问号+尖括号+组名” 作用:为每一个组匹配指定一个名字 ,可以通过exec方法返回结果的groups属性上引用该组名 示例1let result = /(?<year>\d{4})-(?<month>\d{2})/.exec('2019-10'); // result=[‘2019-10’,‘2019’,10] result.groups={year:‘2019’, month:‘10’} 注意:如果要在正则表达式内部引用某个“具名组匹配”,可以使用 \k<组名> 的写法,同时数组引用也依然有效 示例2let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test('abc!abc!abc') // true let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test('abc!abc!ab') // false

ES6对正则的改进(简要总结)的更多相关文章

  1. ES6入门——正则的扩展

    1.RegExp构造函数 在ES5中,RegExp构造函数的参数有两种情况.第一种情况是参数是字符串,这时第二个参数表示正则表达式的修饰符:第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表 ...

  2. ES6扩展——正则扩展(u、y修饰符)

    //下面三行代码效果一样 //全局匹配开头为a的 const regexp1 = /^a/g; const regexp2 = new RegExp('a','g'); const regexp3 = ...

  3. ES6(四) --- 正则 Number Math

    想学vue了  重启ES6的学习之路 在ES5 中正则的构造器  RegExp  不支持第二个参数 ES6 做了调整   第二个参数表示正则表达式的修饰符(flag) var regex = new ...

  4. es6的正则扩展笔记之修饰符

    es6对于正则表达式添加了 u 修饰符和 y 修饰符. u 修饰符:含义为“Unicode模式”,用来正确处理大于\uFFFF的Unicode字符.    该修饰符不光会正确处理正则表达式,还会正确处 ...

  5. ES6对数组的扩展(简要总结)

    文章目录 数组的扩展(ES6) 1. 扩展运算符 2. Array.from 3. Array.of() 4. copyWithin() 5. find() 和 findIndex() 6. fill ...

  6. 【es6】正则扩展

  7. 精读《正则 ES2018》

    1. 引言 本周精读的文章是 regexp-features-regular-expressions. 这篇文章介绍了 ES2018 正则支持的几个重要特性: Lookbehind assertion ...

  8. ES6(正则扩展)

    ES6中正则的扩展 正则新增特性 一.构造函数的变化 1.ES5中new一个正则对象方法 (一行中2个参数,二行中1个参数) (第一行中的第一个参数必须是字符串) 2.ES6中新增一种方法(构造函数) ...

  9. es6正则表达式

    es6中如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符. 而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符. new RegExp(/ab ...

随机推荐

  1. GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!

    大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻... 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚.当时一方面是因为菜,看着这种全是 ...

  2. day 12 函数名的应用 闭包 迭代器

    今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用   #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...

  3. scrapy抓取国家社科基金项目数据库

    1.明确任务 目标网站:http://fz.people.com.cn/skygb/sk/index.php/Index/seach 抓取任务:抓取近五年某关键词(例如"能源".” ...

  4. Spring IOC初始化深度解析

    1.前言 本文是基于JAVA配置方法对Spring IOC进行分析,掌握Spring IOC初始化流程对于我们更好的使用Spring.学习Spring还是很有帮助的,本文所使用的的Spring版本为5 ...

  5. Android利用碎片fragment实现底部标题栏(Github模板开源)

    在安卓开发当中,一个十分重要的布局则是底部标题栏了,拥有了底部标题栏,我们就拥有了整个软件UI开发的框架,一般而言,整个软件的布局首先就是从底部标题栏开始构建,然后再开始其他模块的编写,组成一个完善的 ...

  6. 前端vue如何下载或者导出word文件和excel文件

    前端用vue怎么接收并导出文件 window.location.href = "excel地址" 如果是 get 请求,那直接换成 window.open(url) 就行了 创建一 ...

  7. CCNA 之 九 STP生成树协议

    STP生成树 在上一次实验中,使用了单臂路由是两个不同的VLAN之间进行通信,而单臂路由的这种网络拓扑,当一条链路或者路由设备出现故障的时候,整个网络就会瘫痪. 称此网络为:不健壮的,无冗余的网络环境 ...

  8. C# partial 关键字分析

    简单的来说 partial是局部类型的意思 就是说有这个关键字的类.结构或接口可以写成几个部分 比如 public partial class Program { static void Main(s ...

  9. LNMP Shell脚本发布

    #!/bin/bash # : #This author is DKS #auto install nginx mysql php ################################## ...

  10. C语言博客作业08

    C语言I博客作业08](https://www.cnblogs.com/490-85-00-58-/p/11863312.html) 问题 回答 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...