RegExp

作者: zdxhxh | 来源:发表于2020-01-16 10:25 被阅读0次

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模式

相关文章

网友评论

      本文标题:RegExp

      本文链接:https://www.haomeiwen.com/subject/sacfzctx.html