首先,在这篇文章中所有的代码都是运行在6。ES5需要修改运行前。但本文并不涉及6太多新的功能,而且由于V8不支持你的改性剂,最后的实现基本上是由知识的ES5写。

起初,我只是想记录的正则表达式匹配的特殊字符的Unicode方式,写的V8引擎不支持你的改性剂,并开始研究如何将字符串转换为UTF-16格式字符串,发现ES5 Unicode编码单元规则> 0x10000不支持的过程中,如何将在研究。然后实现超过0x10000超过字符串的转换,在此记录。

我遇到了一个实用的正则表达式匹配特殊字符前的规定,例如,一款of'ab * CD美元,你好,我也是好} 我ntfault赛格$ 你好,世界,用户可以选择用*或$来划分字符串。

在Javascript和$中,预定义字符的特殊字符不能直接写入正则表达式中,并需要逃逸,如。

我们需要根据用户的选择编写正则表达式,并将其封装到函数中:

复制代码代码如下所示:

函数注册表(输入){

返回新的正则表达式(` $ {投入} `)

}





这是一个很好看的开始,在字符转义后遇到了一些特殊字符可以,但是,现实是残酷的:当用户输入N或T这类字符的话,正则表达式返回到或所有标签,这违反了用户的初衷。

通常有一种方法可以写出需要转换的所有特殊字符,然后逐一匹配。这种写作方式非常累人,而且可能缺少匹配,因为统计中没有特殊字符。

这时,Unicode即将登台。在Javascript中,我们也可以使用Unicode来表示一个字符,例如,'a'can被写为你{ 61 },你也可以写为 U { 4f60 }。

对于Unicode的引入,可以看到Unicode和Javascript的详细解释。

ES5提供charcodeat()在指定的索引返回字符的Unicode值的方法,但Unicode代码单元> 0x10000除了es2015增添了一种新的方法codepointat(),它可以返回的值大于0x10000字符串,返回值是小数,此时我们还需要转16通过ToString(16)。

封装后的功能如下

复制代码代码如下所示:

功能tounicode(s){

返回` U { $ { s.codepointat(ToString)(16)} } `

}

ToUnicode($ U { 24 })->



reencapsulate注册功能

复制代码代码如下所示:

函数注册表(输入){

返回新的正则表达式(` $ { tounicode(输入)} `,U)

}



事实上,我想在这里,是正确的但不幸的是,V8并不支持regexp U修饰符。当V8支持它,它要在这里完成。没关系.这只是一种以Unicode的方式传递特殊字符的想法。

虽然V8不支持U修饰符,但我们不能停止它作为一个追求代码农民,我们可以使用其他方法来继续这个完美的。


功能tounicode(s){
创建一个` U $ { UTF(s.charcodeat(0),ToString(16))} `
如果(s.charcodeat(1))
{一}美元= ` U $ { UTF(s.charcodeat(1),ToString(16))} `
返回一个
}
函数定义(s){
返回array.from('00 ').concat(array.from(S)),Slice(4)和()。
}
在这里使用var,而不是LET语句,因为代码直接复制到Chrome控制台,您可以看到实现的结果。
测试
/ / tounicode('a')-> u0061
/ / tounitcode( ud842 udfb7 )——>
函数注册表(输入){
返回新的正则表达式(` $ { tounicode(输入)} `)
}
再次
注册表($ test)($ TRUE)


以上是与您共享的正则表达式的unicode匹配的一个特殊字符。