正则表达式巧用 Unicode 婚配特别字符

正则表达式巧用 Unicode 婚配特别字符

作者 @zwhu

原文章 @github

起首声明,本文一切的代码都是在 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

写完啦,看到末了的同砚,假如以为对你有协助的话,就点个引荐呗。

    原文作者:zwhu
    原文地址: https://segmentfault.com/a/1190000003751415
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞