正则表达式
##构造函数的修改
以前的构造函数只支持字符串
var regex = new RegExp("xyz", "i");
var regex = /xyz/i;
现在的接受正则表达式
作为参数,就是传入正则表达式的拷贝。
如果有第二个参数的话,则将会覆盖原修饰符
,如果没有的话,则使用传入的表达式的修饰符。
var regex = new RegExp(/xyz/gi, "g");
console.log(regex.flags); //g
##新的修饰符
###u 修饰符unicode模式
用来正确处理大于\uFFFF 的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
ECMAscript 正则表达式支持就不够细致
一直的就不支持 4 个字节的 UTF-16
- ‘啊’的是\u554a,’啊’.length //1
- ‘𠮷’就是\ud842\udfb7,’𠮷’.length //2
/^\uD83D/.test('\uD83D\uDC2A')
// true
/^\uD83D/u.test('\uD83D\uDC2A')
//false
//es5不支持4个字节的UTF-16,会将齐识别为两个字符
####.字符
- 正则里面是匹配除了换行符以外的任意字符。
- es5 不包括码点大于 0xFFFF 的 Unicode 字符,加上了 u 才能识别
var s = "𠮷";
console.log(/^.$/.test(s)); //false
console.log(/^.$/u.test(s)); //true
不添加 u 字符的话,上面的字符串就会被当成两个字符从而匹配失败
‘𠮷’实际上就是这个\ud842\udfb7
####uincode 字符表示法
/\u{61}/.test("a") / // false
//简单的61次u
a /
u.test("a") / // true
//识别为u0061
𠮷 /
u.test("𠮷"); // true
//想写超过四位的只能这么表示
如果想使用这种大括号的形式来表示 unicode 字符
- 前面需要加上\u 之外
- 还需要加上 u 修饰符
####量词
/a{2}/.test('aa') // true
/a{2}/u.test('aa') // true
/𠮷{2}/.test('𠮷𠮷') // false
// /\ud842\udfb7{2}/.test('\ud842\udfb7\ud842\udfb7’);
/𠮷{2}/u.test('𠮷𠮷') // true
也就是下面的情况是可以的
console.log(/𠮷{2}/.test(‘\ud842\udfb7\udfb7’)); //true
####预定义模式
/^\S$/.test(‘𠮷’) // false
/^\S$/u.test(‘𠮷’) // true
\S 能够识别非空白字符,然后通过 u 修饰符可以正确地将两位的 UTF-16 识别为一位,故而匹配了
与此相同的还有\D(非数字),\W
\w在正则中可以识别`汉字`,但是ECMA的正则实现不全面,不能匹配汉字。
####i 修饰符
如果想识别非规范的字符,必须得加上 u
/[a-z]/i.test("\u212A") / // false
[a - z] /
iu.test("\u212A"); // true
###y 修饰符
“粘连”(sticky)修饰符,表现与g修饰符
很像,g 只要剩下的存在匹配就行,但是 y 要求必须从剩下的第一位开始匹配
注意第一次也必须从lastindex匹配,也就是默认的0开始
var s = "aaa_aa_a";
var r1 = /a+/g;
console.log(r1.exec(s));
console.log(r1.exec(s));
var r2 = /a+/y;
console.log(r2.exec(s));
console.log(r2.exec(s));
babel,traceur几个转换器暂未支持,还是firefox给力
###sticky 属性
与 y 修饰符相匹配,这个表示是否设置了 y
###flags 属性
会返回正则表达式的修饰符
就和 source 属性会返回表达式的正文一样
// 返回正则表达式的修饰符
/abc/gi.flags /
// 'gi'
abc /
ig.sources;
//abc
###字符串的正则方法
字符串对象使用正则表达式的四个方法:
match,replace,search,split
ES6 在语言的内部改为了使用 RegExp 的实例方法
所有与正则相关的方法,都定义到了RegExp对象上
###RegExp.escape
静态方法是来将字符串转义成正则模式的。
并没有成为 6 或者 7 的官方方法,只是有这个需求。
就是将一些保留字符进行转义
参考自阮一峰的ECMAScript6 入门
todo: i 修饰符中有些 Unicode 字符的编码不同,但是字型很相近,比如,\u004B 与\u212A 都是大写的 K?
todo: 再细一点
todo: 文字编码
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com
文章标题:正则表达式
文章字数:965
本文作者:泽鹿
发布时间:2019-08-28, 16:45:23
最后更新:2019-08-28, 20:05:27
原始链接:http://panyifei.github.io/2019/08/28/前端技术/js/框架以及规范/ECMAScript6/正则表达式/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。