js正则遇到的一些坑

724 阅读1分钟

除了_(下划线)的所有大小写字母、数字、中文和半角符号

产品提了这个需求,应用场景是表单验证,刚开始看到觉得十分简单,^_不就解决了?
事实没有那么简单。
我的正则验证器代码:

    Validators.pattern('^[a-zA-Z0-9\u4e00-\u9fa5]+$')

匹配非大小写字母、数字和中文。
因为使用了验证器,所以反着写。想匹配符号怎么写呢?
看看需求:

天哪!我要把这些符号都写进去?

    Validators.pattern('^[a-zA-Z0-9.-+=~!@#$%^&*(),?;:\'\"\|\u4e00-\u9fa5]+$')

然鹅这回连输入sadasdas都被检测到违法字符了,为什么呢因为 里面有单引号‘,双引号"和|,还没说[]呢,这个也会使正则错乱。
在网上找了半天,没有现成的代码 -_-只好自己解决。
想了一下,要么用unicode代替',",|,[],要么使用Ascil编码,果断采用Ascil编码,不要问为什么,问就是我乐意。
首先看看Ascil编码,网上图片千奇百怪,看不懂...终于找到一个容易理解的.

于是,代码可以写成

Validators.pattern('^[a-zA-Z0-9\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F\u4e00-\u9fa5]+$')a5]+$')

x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F匹配了所有半角字符,我想略过_怎么办,请看图_的编码是5e,ok,代码改写为:

Validators.pattern('^[a-zA-Z0-9\x21-\x2f\x3a-\x40\x5b-\x5e\x60\x7B-\x7F\u4e00-\u9fa5]+$')

完成。 希望大家可以多多避(cai)坑吧。