ES第六章 正则的扩展

一、RegExp构造函数

(1)参数字符串,参数一位字符串,此时第二个参数表示正则表达式的修饰符(flag)

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

(2)正则表达式,参数一为正则表达式,此时会返回原有的正则表达式

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

(3)若RegExp构造函数的参数一为正则对象,参数二可用于指定修饰符,那么指定的修饰符会覆盖前面的修饰符。

var regex = new RegExp(/abc/ig,'i');
alert(regex.flags);	//"i"

二、字符串的正则方法

字符串对象共有4个方法可以使用正则表达式:match(),replace(),search(),split().
ES6将这四个方法全部调用RegExp方法:

String.prototype.match 调用 RegExp.prototype[Symbol.match]
String.prototype.replace 调用 RegExp.prototype[Symbol.replace]
String.prototype.search 调用 RegExp.prototype[Symbol.search]
String.prototype.split 调用 RegExp.prototype[Symbol.split]

三、u修饰符(unicode模式)

用于处理大于\uFFFF的Unicode字符。

/^\uD83D/u.test('\uD83D\uDC2A') // false,用了u修饰符,后面是一个字符
/^\uD83D/.test('\uD83D\uDC2A') // true,没有用u修饰符,第一个能匹配到

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

var s = '𠮷';
// false,不加u修饰符,会被认为是两个字符,匹配失败
/^.$/.test(s) 

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

(2)Unicode字符表示法
ES6新增用 { } 表示Unicode字符,但必须用u修饰符。

/\u{61}/.test('a') // false,没有用u修饰符,会识别连续的61个a
/\u{61}/u.test('a') // true
/\u{20BB7}/u.test('𠮷') // true

(3)量词
使用u修饰符后,所有量词都会识别码点大于0xFFFF的Unicode字符

/a{2}/.test('aa') // true
/a{2}/u.test('aa') // true
/𠮷{2}/.test('𠮷𠮷') // false
/𠮷{2}/u.test('𠮷𠮷') // true

(4)预定义模式
u修饰符也能影响到预定义模式,能否正确识别码点

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

(5)i修饰符
有些字符编码不同但是字型相近,如:\u0048,\u212A都是大写的K。

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

(6)转义
没有u修饰符的时候,转义无效;

/\,/	输出:/\,/

没有u修饰符时,转义报错。

/\,/u // 报错

四、RegExp.prototype.unicode属性

正则新增unicode属性,用来表示是否设置了u修饰符

const r1 = /hello/;
const r2 = /hello/u;

r1.unicode // false
r2.unicode // true

五、y修饰符(粘连(sticky)修饰符)

与g修饰符类型,都是全局匹配,后一次匹配从上一次匹配的下一个位置开始;不同自安于,g修饰符只要剩余里存在匹配要可以,而y修饰符必须从剩余位置的第一个位置开始。

var s = 'aaa_aa_a';
var r = /a+_/y;

r.exec(s) // ["aaa_"]
r.exec(s) // ["aa_"]

六、RegExp.prototype.sticky属性

表示是否设置了y修饰符

var r = /hello\d/y;
alert(r.stricky);	//true

七、RegExp.prototype.flags属性

flags属性返回修饰符

alert(/abc/ig.flags);

ES5的source属性,可以返回正则表达式的正文

alert(/abc/ig.source);

八、s修饰符:dotAll模式

(.)修饰符:点代表任意单个字符,但有两个例外。
(1)一个四字节的UTF-16字符,用u修饰符可以解决
(2)另一个是行终止符,有4个(\u000A:换行符;\u000D:回车符;\u2028:行分隔符;\u2029:段分隔符)
(.)不会匹配到这4个终止符。

/foo.bar/.test(`foo\nbar`);	  //false,(.)不能替换掉\n
/foo[^]bar/.test('foo\nbar');	//true,[^]可以替换\n

九、Unicode属性类

新的类\p{…},\P{…},允许正则表达式匹配符合Unicode某种属性的所有字符,必须使用u修饰符。

  • 属性类:(1)属性名(2)属性值。对于某些属性,可以只有属性名或属性值。
  • \p{属性名=属性值}
  • \P{…}是\p{…}的反向匹配,匹配的是不满足条件的字符。

十、具名组匹配

(1)简介:使用()匹配数据,用exec()方法;

const a = /(\d{4})-(\d{2})-(\d{2})/;
const b = a.exec('1999-12-31');
/*b[1]==1999	b[2]==12 	b[3]==31*/
  • 具名组匹配为每一项加了名称。格式:问号+尖括号+组名
    如:?< year >
const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;

const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31

十一、正则匹配索引

  • 正则实例的exec()方法,返回一个index属性,获取匹配结果的开始位置,indices属性,可以拿到匹配的开始位置和结束位置。
const text = 'zabbcdef';
const re = /ab/;
const result = re.exec(text);

result.index // 1
result.indices // [ [1, 3] ]
  • 开始位置在匹配结果之中,结束位置不在匹配结果之中
const text = 'zabbcdef';
const re = /ab+(cd)/;
const result = re.exec(text);

result.indices // [ [ 1, 6 ], [ 4, 6 ] ]
  • indices属性数组有一个groups属性,可以获取具名组匹配的开始位置和结束为止。匹配不成功返回undefined。
const text = 'zabbcdef';
const re = /ab+(?<Z>cd)/;
const result = re.exec(text);

result.indices.groups // { Z: [ 4, 6 ] }

十二、String.prototype.matchAll()

一次取出所有匹配,返回遍历器,可用for…of循环取出。若要转换成数组,可用Array.front().即:

// 转为数组的方法一
[...string.matchAll(regex)]

// 转为数组的方法二
Array.from(string.matchAll(regex))
const string = 'test1test2test3';
const regex = /t(e)(st(\d?))/g;

for (const match of string.matchAll(regex)) {
  console.log(match);
}
// ["test1", "e", "st1", "1", index: 0, input: "test1test2test3"]
// ["test2", "e", "st2", "2", index: 5, input: "test1test2test3"]
// ["test3", "e", "st3", "3", index: 10, input: "test1test2test3"]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值