• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    正则表达式之 Unicode 匹配特殊字符
    POST TIME:2021-10-18 05:36

    首先声明,本文所有的代码都是在 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 匹配特殊字符

    您可能感兴趣的文章:
    • 正则表达式教程之匹配单个字符详解
    • String字符串匹配javascript 正则表达式
    • C#匹配中文字符串的4种正则表达式分享
    • 正则表达式匹配不包含某些字符串的技巧
    • js 正则表达式学习笔记之匹配字符串
    • 正则表达式 匹配至少有一个非空白字符并且不超过指定长度
    • 匹配任意字符的正则表达式写法
    • Python 匹配任意字符(包括换行符)的正则表达式写法
    • 正则表达式匹配任意字符(包括换行符)的写法
    • 请教一个正则表达式,匹配所有Html标签外部的指定字符串
    • PHP中正则表达式对UNICODE字符码的匹配方法
    • 正则表达式教程之匹配一组字符详解
    上一篇:MySQL中REGEXP正则表达式使用大全
    下一篇:收集整理ASP.NET中17种常用正则表达式
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信