ES6语法七-正则Unicode模式和定点模式
大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
Unicode标识
正则表达式的Unicode
标识会打开Unicode
匹配。
JavaScript
字符串通常解释为16
位字符序列,这些字符对应基本多语言平面(Basic Multilingual Plane, BMP)中的字符。但还有很多UTF-16
字符在这个范围之外,所以字符串中还可能包含这些多字节字符。
在ES6
之前正则表达式只能基于BMP
字符匹配,这意味着那些扩展字符串会被当作两个独立的字符来匹配。通常这样试不理想的。
在
ES6
中,u
标识符表示正则表达式用Unicode
字符来处理字符串,把这样的扩展字符当作当个实体来匹配。其实UTF-16
不完全是16
位,现代的Unicode
使用21
位表示,像UTF-8
,UTF-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