05. 正则的扩展

2017-12-15  本文已影响0人  吃紫薯的water

正则的扩展

原书作者:阮一峰
原书地址:ECMASript 6入门

  • RegExp构造函数
  • 修饰符
  • 后行断言(提案)

1. RegExp构造函数

var regex = new RegExp('xyz', 'i');
// 等价于
var regex = /xyz/i;
// 参数是字符串,第二个参数为正则表达式的修饰符

var regex = new RegExp(/xyz/i);
// 等价于
var regex = /xyz/i;
// 参数是一个正则表达式的情况
var regex = new RegExp(/xyz/, 'i');
// Uncaught TypeError: Cannot supply flags

new RegExp(/abc/ig, 'i').flags
// "i"
// i替换了原ig为新的修饰符

2. 修饰符

ES6新增的flags属性返回对应的修饰符

// ES5 的 source 属性
// 返回正则表达式的正文
/abc/ig.source
// "abc"

// ES6 的 flags 属性
// 返回正则表达式的修饰符
/abc/ig.flags
// 'gi'
/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true
// \uD83D\uDC2A是一个四个字节的 UTF-16 编码,代表一个字符
// 不加入u时,会错误认为是两个字符
var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;

r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]

r1.exec(s) // ["aa"]
r2.exec(s) // null
U+000A 换行符(\n)
U+000D 回车符(\r)
U+2028 行分隔符(line separator)
U+2029 段分隔符(paragraph separator)

/foo.bar/.test('foo\nbar')
// false
// .不能匹配\n

/foo[^]bar/.test('foo\nbar')
// true
// 变通的写法如上所示

提案中,/s使得.可以匹配任意字符
这被称为dotAll模式,dot即.可以匹配任意字符

/foo.bar/s.test('foo\nbar') // true

3. 后行断言(提案)

(ES5 仅支持先行断言和先行否定断言)
”先行断言“指的是,x只有在y前面才匹配,必须写成/x(?=y)/;
先行否定断言“指的是,x只有不在y前面才匹配,必须写成/x(?!y)/;

/\d+(?=%)/.exec('100% of US presidents have been male')  // ["100"]
/\d+(?!%)/.exec('that’s all 44 of them')                 // ["44"]

“后行断言”正好与“先行断言”相反,x只有在y后面才匹配,必须写成/(?<=y)x/;
”后行否定断言“则与”先行否定断言“相反,x只有不在y后面才匹配,必须写成/(?<!y)x/

/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill')  // ["100"]
/(?<!\$)\d+/.exec('it’s is worth about €90')                // ["90"]
上一篇 下一篇

猜你喜欢

热点阅读