保藏本站 保藏本站
188bet注册网主页 - 软件测验 - 常用手册 - 站长东西 - 技能社区
主页 > 正则表达式 > 正文

主页 - PHP - 数据库 - 操作体系 - 游戏开发 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell编程 - DOS指令 - jQuery - CSS款式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

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

首要声明,本文一切的代码都是在 ES6 下面运转,ES5需求修正之后才干运转,可是本文没有涉及到太多的ES6新特性,并且由于v8对u修饰符不支撑,最终的完成也根本是用ES5的常识写的代码。

开始我仅仅想记载下正则表达式用unicode的办法来匹配特别字符,写着写着发现 v8 对 u 修饰符的不支撑,又转而去研讨怎样转化字符串到utf-16的格局,在研讨怎样转化的过程中发现ES5的正则对 unicode 编码单元 > 0x10000 的字符串不支撑,再转而去完成了一遍对大于 0x10000 的字符串的转化,特此记载。

之前有遇到过一个有用正则表达式匹配特别字符的需求,例如一段文本 'ab*cd$你好我也好]nseg$me*ntfaultnhello,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('��') --> "ud842udfb7"
function reg(input) {
 return new RegExp(`${toUnicode(input)}`)
}
// 再测验一下
reg('$').test('$') --> true

以上内容便是188bet注册网小编给咱们共享的正则表达式之 Unicode 匹配特别字符

收集收拾ASP.NET中17种常用正则表达式
"^/d+$"//非负整数(正整数+0)"^[0-9]*[1-9][0-9]*$"//正整数"^((-/d+)(0+))$"//非正整数(负整数+0)"^-[0-9]*[1-9][0-9]*$"//负整数"^-/d+$"//整数"^/d+(/./d+)$"//非负浮点数(

Android中手机号、车牌号正则表达式大全
手机号手机称号有GSM:表明只支撑中国联通或许中国移动2G号段(130、131、132、134、135、136、137、138、139、145、147、150、151、152、155、156、157、158、159、

Android正则表达式
要严厉的验证手机号码,有必要先要清楚现在现已开放了哪些数字最初的号码段,目前国内号码段分配如下:移动:134、135、136、137、138、139、150、151、15

本周排行

更新排行

强悍的草根IT技能社区,这儿应该有您想要的! 友情链接:b2b电子商务
Copyright © 2010 touzhuwang75.com. All Rights Rreserved  京ICP备05050695号