RegEep
在ES5中,正则的构造函数如果第一个参数为正则时,第二个参数添加修饰符会报错
new RegExp(/aaa/,'i') // Uncaught TypeError:
ES6却可以
字符串的正则方法
字符串的正则方法
- match
- replace
- search
- split
ES6将这4个方法全部调用在RegExp的实例上,也就是它内部是使用RegExp对象处理的.
RegExp.prototype.unicode
正则实例加了unicode属性,表示是否设置了u修饰符
const es6 = /hello/u;
es.unicode // true
RegExp.prototype.sticky
正则实例加了sticky属性,表示是否设置了y修饰符
const es6 = /hello/y;
es.sticky // true
RegExp.prototype.flags
正则实例加了flags属性,可以返回正则的修饰符
const reg = /666/gi
reg.flags // 'gi'
u修饰符
ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。(不懂)
/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true
拥有以下几点变化都是围绕对于码点0XFFFF的Unicode字符 :
- .修饰符 : .含义是除了换行符以外的任意单个字符,对于码点0XFFFF的Unicode字符,点字符不能识别,必须配合u修饰符
- Unicode字符表示法 :
/\u{xxxx}/u
可以使用{}
表示Unicode字符,这种表示法必须加上u修饰符才能识别大括号,否则会被解释成强化元字符(量词) - 其他元字符(强化),如量词 : {0,2} 本来这个元字符是不处理这个对于码点0XFFFF的Unicode字符,但加上u修饰符后,就处理了,其他元字符同理。(就是说原本一些元字符是不包括这个码点0XFFF的Unicode字符的)
y 修饰符
y修饰符表示粘连的意思,看代码
const reg = /aa/y
const str = 'baaaa_aa'
console.log(reg.exec(str)) // none
它要求必须从第一个字符开始匹配 (类似 ^ )
const reg = /aa/y
const str = 'aabb_aa'
console.log(reg.exec(str))
这个修饰符设计的初衷,好像是这样的,就是说能够在g(全局匹配下的^有效)
const str = 'aaaba'
// 我希望将b前面的a全部死亡
const reg = /a/gy
console.log(str.replace(reg,'死亡')) // logs 死亡死亡死亡ba
const errorReg = /^a/g
console.log(str.replace(errorReg,'死亡')) // 死亡aaba
s修饰符 doAll模式
.是一个元字符,代表任意单个字符,但是有两个例外
- 四个字节的UTF-16字符,这个可以用u修饰符解决
- 行终止符
所谓的行终止符,就是该字符表示一行的终结,如
- U+000A 换行符(\n)
- U+000D 回车符(\r)
- U+2028 行分隔符(line separator)
- U+2029 段分隔符(paragraph separator)
/foo./.test('foo\n') // false
.不匹配\n,所以正则表达式返回false
/foo./s.test('foo\n') // true
这种称为doAll模式
网友评论