首先声明,本文所有的代码都是在 ES6 下面运行,ES5需要修改之后才能运行,但是本文没有涉及到太多的ES6新特性,而且由于v8对u修饰符不支持,最后的实现也基本是用ES5的知识写的代码。
最初我只是想记录下正则表达式用unicode的方式来匹配特殊字符,写着写着发现 v8 对 u 修饰符的不支持,又转而去研究怎么转换字符串到utf-16的格式,在研究怎么转换的过程中发现ES5的正则对 unicode 编码单元 > 0x10000 的字符串不支持,再转而去实现了一遍对大于 0x10000 的字符串的转换,特此记录。
之前有遇到过一个实用正则表达式匹配特殊字符的需求,例如一段文本 'ab*cd$你好我也好]\nseg$me*ntfault\nhello,world' ,用户可以选择用 * 或者 $ 来分割字符串。
在javascript中, $ 和 * 都是预定义的特殊字符,不能直接写在正则表达式中,而需要转义,写成 /\$/ 或者 /\*/ 。
我们需要根据用户的选择来写正则表达式,封装成一个函数就是:
复制代码 代码如下:
function reg(input) {
return new RegExp(`\\${input}`)
}
这种写法初看上去很美好,将字符都转义之后遇到一些特殊的字符可以匹配,然而现实是残酷的:当用户输入的是 n 或者 t 这一类的字符的话,返回的正则表达式为 /\n/ 或者 /\t/ ,匹配的就是所有的制表符,这就违背了用户的初衷。
通常有一种写法就是把所有需要转义的特殊字符都列出来,然后再逐一匹配,这种写法很耗费精力,而且可能因为没有统计到的特殊字符而出现漏匹配的情况。
这个时候unicode就隆重登场了,在 JavaScript 中,我们也可以用unicode来表示一个字符,例如 'a' 可以写成'\u{61}', '你' 也可以写成 '\u{4f60}'。
关于unicode的介绍大家可以看 Unicode与JavaScript详解
ES5 中提供了 charCodeAt() 方法来返回指定索引处字符的 Unicode 数值,但是 Unicode 编码单元 > 0x10000 的除外, ES2015 中又增加了一个新的方法 codePointAt() 可以返回大于 0x10000 字符串的数值。返回的数值是十进制的,此时我们还需要通过 toString(16) 转成16进制。
封装之后的函数如下
复制代码 代码如下:
function toUnicode(s) {
return `\\u{${s.codePointAt().toString(16)}}`
}
toUnicode('$') -> '\u{24}'
重新封装reg函数为
复制代码 代码如下:
function reg(input) {
return new RegExp(`${toUnicode(input)}`, 'u')
}
其实写到这里,我希望是对的,但是很不幸,V8 不支持 RegExp 的 u 修饰符。V8支持的话,写到这里就应该结束了,没关系,这里只是提供一种用unicode的方式来转义特殊字符的思想。
虽然v8不支持u修饰符,作为一个有追求的码农,当然不能止步于此,我们也可以使用其他方法继续把这个完善
function toUnicode(s) { var a = `\\u${utf(s.charCodeAt(0).toString(16))}` if(s.charCodeAt(1)) a = `${a}\\u${utf(s.charCodeAt(1).toString(16))}` return a } function utf(s) { return Array.from('00').concat(Array.from(s)).slice(-4).join('') } // 这里用var而没有用let声明,是因为这些代码直接复制到 chrome 的控制台下就可以看到执行结果 // 测试一下 // toUnicode('a') --> "\u0061" // toUnitcode('"\ud842\udfb7" function reg(input) { return new RegExp(`${toUnicode(input)}`) } // 再测试一下 reg('$').test('$') --> true
以上内容就是小编给大家分享的正则表达式之 Unicode 匹配特殊字符
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]