likes
comments
collection
share

ES6语法七-正则Unicode模式和定点模式

作者站长头像
站长
· 阅读数 47

大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~


Unicode标识

正则表达式的Unicode标识会打开Unicode匹配。

JavaScript字符串通常解释为16位字符序列,这些字符对应基本多语言平面(Basic Multilingual Plane, BMP)中的字符。但还有很多UTF-16字符在这个范围之外,所以字符串中还可能包含这些多字节字符。

ES6之前正则表达式只能基于BMP字符匹配,这意味着那些扩展字符串会被当作两个独立的字符来匹配。通常这样试不理想的。

ES6中,u标识符表示正则表达式用Unicode字符来处理字符串,把这样的扩展字符当作当个实体来匹配。其实UTF-16不完全是16位,现代的Unicode使用21位表示,像UTF-8UTF-16这样的标准只是大概表明用多少位来表示一个字符。

比如𝄞这个符号在BMP下解释位两个独立的字符。而在Unicode模式,它作为一个单独的字符匹配。

部分匹配是正常的

/𝄞/.test(" 𝄞-clef") // true  

如下的情况就有差异了

/^.-clef/.test("𝄞-clef") // false
/^.-clef/u.test("𝄞-clef") // true

正则匹配的是开头一个字符 + -clef,在BMP模式下𝄞解析位两个字符,在Unicode模式下只当作一个字符,所以第二个匹配成功了。

定点标识

ES6新增的标签模式是y,通常称为"定点模式"。

定点是指在正则表达式的起点有一个虚拟的锚点,从正则表达式的lastIndex属性指定的位置开始匹配。

var re1 = /foo/,
    str = "++foo++"
    re1.lastIndex // 0
    re1.test(str) // true
    re1.lastIndex // 0
    re1.lastIndex = 4
    re1.test(str) // true
    re1.lastIndex // 4
  • test(..)并不关心lastIndex的值,总是从输入字符串的起始位置开始执行匹配。
  • 因为我们的模式并没有起始锚点^
  • test(..)不更新lastIndex

现在试下定点模式

var re1 = /foo/y,
    str = "++foo++"
    re1.lastIndex // 0
    re1.test(str) // false
    re1.lastIndex // 0
    re1.lastIndex = 2
    re1.test(str) // true
    re1.lastIndex // 5 
  • test(..)使用lastIndex作为str中精确而且位置的位置寻找匹配。不会向前移动去寻找,要么匹配位于lastIndex位置,要么就没有匹配。
  • 如果匹配成功,test()会更新lastIndex指向紧跟匹配内容之后的那个字符。如果匹配失败,test()会把lastIndex重置回0

转载自:https://juejin.cn/post/7135624793822330911
评论
请登录