ES6躬行记(10)——正则表达式

简介:   在ES5中,如果使用构造函数RegExp()初始化RegExp对象(即正则表达式),并且它的第一个参数是正则表达式时,那么不允许再传入标志字符串(即第二个参数)。而ES6更改了这项限制,如果传入了第二个参数,那么就会取代第一个参数中的标志,如下所示。

  在ES5中,如果使用构造函数RegExp()初始化RegExp对象(即正则表达式),并且它的第一个参数是正则表达式时,那么不允许再传入标志字符串(即第二个参数)。而ES6更改了这项限制,如果传入了第二个参数,那么就会取代第一个参数中的标志,如下所示。

var reg = new RegExp(/\w/g, "i");
reg.toString();            //"/\w/i"

一、u标志


  由于正则表达式无法正确处理辅助平面中的Unicode字符,因此ES6新增了u标志,使其能够处理两个编码单元的字符。依然以字符“𠮳”为例,下面是两条正则表达式的匹配语句,返回的结果都是false。

var word = "𠮳";
/^.$/.test(word);             //false
/\u{20BB3}/.test(word);       //false

  第一条匹配语句中的元字符“.”表示除换行符之外的任意字符,但只能匹配一个字符,而“𠮳”却会被当成两个字符来对待,因此匹配失败;第二条匹配语句中使用了Unicode转义字符的新形式,但正则表达式会将花括号中的内容识别成量词,因此匹配也失败。下面的代码会为两个正则表达式添加u标志,此时就能成功匹配。

/^.$/u.test(word);             //true
/\u{20BB3}/u.test(word);       //true

  ES6还为正则表达式增加了一个只读的布尔属性:unicode,指示正则表达式是否携带了u标志。


二、y标志


  此标志也叫粘性(sticky)标志,当正则表达式中携带y标志时,匹配会从lastIndex属性指定的位置开始。与g标志不同,如果在起始处的第一个位置没有匹配成功,那么就会终止匹配,下面演示了这两个标志的区别。


var str = "pw1st2pw3",
  pattern1 = /pw\d/g,
  pattern2 = /pw\d/y;
pattern1.test(str);            //true
pattern2.test(str);            //true
pattern1.test(str);            //true
pattern2.test(str);            //false


  示例中的两个正则表达式分别携带g和y标志,用于匹配“pw”后跟一个数字,各自调用了两次test()方法,在第二次调用时都会更新lastIndex属性的值,此时得到了两个不同的结果。

  ES6也为正则表达式增加了一个用于标识是否携带y标志的布尔属性:sticky,与unicode属性一样也是只读的。


三、flags属性


  在ES5的时代,只能通过正则表达式的source属性得到模式规则,而ES6新增的flags属性还可以获取到它所携带的标志,但要注意,返回的值得按“gimuy”的顺序排列。这两个都是只读属性,具体使用如下所示。

var pattern = /pw\d/img;
pattern.source;            //"pw\d"
pattern.flags;             //"gim"

 

相关文章
|
6月前
|
Python
编程小白的自学笔记四(正则表达式模块search函数)
编程小白的自学笔记四(正则表达式模块search函数)
|
12月前
|
机器学习/深度学习 前端开发 JavaScript
[正则表达式]_保姆级入门教程_初入正则表达式
[正则表达式]_保姆级入门教程_初入正则表达式
87 0
|
Web App开发 自然语言处理 JavaScript
细读 ES6 | let 真的会提升吗?
本将会从 ES5 中一些怪诞的行为出发,然后再到 ES6 中的 let、const 是否会“提升”的讨论。
138 0
细读 ES6 | let 真的会提升吗?
|
搜索推荐 iOS开发 Python
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(中)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
148 0
|
算法 Python Perl
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(下)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
156 0
|
Web App开发 数据可视化 搜索推荐
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(上)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
183 0
|
存储 自然语言处理 JavaScript
ES6躬行记(9)——字符串
  在介绍字符串之前,有必要先了解一点Unicode的基础知识,有助于理解ES6提供的新功能和新特性。
|
JavaScript 前端开发
ES6躬行记(14)——函数
  在前面的章节中,已陆陆续续介绍了ES6为改良函数而引入的几个新特性,本章将会继续讲解ES6对函数的其余改进,包括默认参数、元属性、块级函数和箭头函数等。
|
安全 JavaScript 前端开发
ES6躬行记(8)——数字
  ES6不仅完善了数字的八进制形式,还补充了一种十六进制形式,并且添加了全新的二进制形式。下面的三个变量分别表示八进制、十六进制和二进制的10,注释中给出了该进制的另一种写法。