• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >正则表达式 > 正则表达式之 Unicode 匹配特殊字符

正则表达式之 Unicode 匹配特殊字符

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了正则表达式特殊字符,js正则表达式特殊字符,正则表达式转义字符,正则表达式替换字符,正则表达式任意字符等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

首先声明,本文所有的代码都是在 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}`)
}
</div>

这种写法初看上去很美好,将字符都转义之后遇到一些特殊的字符可以匹配,然而现实是残酷的:当用户输入的是 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}'
</div>

重新封装reg函数为

function reg(input) {
    return new RegExp(`${toUnicode(input)}`, 'u')
}
</div>

其实写到这里,我希望是对的,但是很不幸,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
</div>

以上内容就是小编给大家分享的正则表达式之 Unicode 匹配特殊字符

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 利用正则表达式提取固定字符之间的字符串
  • 正则表达式教程之元字符的使用详解
  • 正则表达式字符类加深理解
  • 正则表达式.号元字符(除了回车符\r和换行符\n)
  • 使用正则表达式替换报表名称中的特殊字符(推荐)
  • 常用的正则表达式大全(数字、字符、固定格式)
  • 正则表达式之 Unicode 匹配特殊字符
  • 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等
  • 正则表达式常用元字符整理小结
  • 简单的用js实现过滤多余字符的正则表达式

相关文章

  • 2017-05-11js正则查找match()与替换replace()用法实例
  • 2017-05-11正则基础之 NFA引擎匹配原理
  • 2017-05-11一个不错的正则
  • 2017-05-11学习正则表达式(js、C#)
  • 2017-05-11正则基础之 神奇的转义
  • 2017-05-11PHP preg_replace() 正则替换所有符合条件的字符串
  • 2017-05-11js中2005-05-02怎么转换为2005/5/2?
  • 2017-05-11WEB开发时常用的正则表达式(PHP和Javascript)
  • 2017-05-11PHP正则表达式的逆向引用与子模式分析
  • 2017-05-11常用正则表达式 整理篇

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
    • 浏览器中的正则表达式陷阱说明
    • 正则表达式 学习资料整理
    • Javascript校验密码复杂度的正则表达式
    • php中正则表达式中的特殊符号
    • Java正则表达式过滤出字母、数字和中文
    • 判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)
    • 正则表达式不包含属性
    • JS基础教程——正则表达式示例(推荐)
    • js中exec、test、match、search、replace、split用法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有