码迷,mamicode.com
首页 > 其他好文 > 详细

ES 正则

时间:2020-11-10 11:40:03      阅读:27      评论:0      收藏:0      [点我收藏+]

标签:any   replace   不能   导致   style   覆盖   结果   col   正则表达   

https://es6.ruanyifeng.com/?search=%E5%B8%83%E5%B0%94&x=0&y=0#docs/regex

转自阮一峰 ES6

 

1、RegExp 构造函数    

  ES5中,RegExp构造函数的参数有两种情况。

第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag)

var regex = new RegExp(xyz, i);
// 等价于
var regex = /xyz/i;

 

第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝。

var regex = new RegExp(/xyz/i);

 

但是,ES5 不允许此时使用第二个参数添加修饰符,否则会报错。

var regex = new RegExp(/xyz/, i);
//这样会报错!!1!

 

ES6 改变了这种行为。如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。

new RegExp(/abc/ig, i).flags
//上面代码中,原有正则对象的修饰符是ig,它会被第二个参数i覆盖。

 

2、字符串的正则方法 

 字符串对象共有 4 个方法,可以使用正则表达式:match()replace()search()split()

 

3、u 修饰符

 

ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。

 

/^\uD83D/u.test(\uD83D\uDC2A) // false
/^\uD83D/.test(\uD83D\uDC2A) // true

上面代码中,\uD83D\uDC2A是一个四个字节的 UTF-16 编码,代表一个字符。但是,ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6 就会识别其为一个字符,所以第一行代码结果为false

 

一旦加上u修饰符号,就会修改下面这些正则表达式的行为。

 (1)点字符

点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符

var s = ??;

/^.$/.test(s) // false
/^.$/u.test(s) // true

上面代码表示,如果不添加u修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。

 

(2)Unicode 字符表示法

 

ES6 新增了使用大括号表示 Unicode 字符,这种表示法在正则表达式中必须加上u修饰符,才能识别当中的大括号,否则会被解读为量词。

 

/\u{61}/.test(a) // false
/\u{61}/u.test(a) // true
/\u{20BB7}/u.test(??) // true

上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配 61 个连续的u

Unicode中 \u{61}等于字符a,正则{61}表示量词   和。* 一样 

(4)预定义模式

u修饰符也影响到预定义模式,能否正确识别码点大于0xFFFF的 Unicode 字符。

 

/^\S$/.test(??) // false
/^\S$/u.test(??) // true

上面代码的\S是预定义模式,匹配所有非空白字符。只有加了u修饰符,它才能正确匹配码点大于0xFFFF的 Unicode 字符。

利用这一点,可以写出一个正确返回字符串长度的函数

 

ES 正则

标签:any   replace   不能   导致   style   覆盖   结果   col   正则表达   

原文地址:https://www.cnblogs.com/zhuangdd/p/13952098.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!