欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二类正则表达式的优化写法

程序员文章站 2022-06-07 17:14:41
...

      只讨论验证方面的。
    首先,验证方法可有二种,正则的test和String的
search,选用哪个?显然选用test好,使用search的一定是没去对比的或拷贝代码的。
    其次,讨论验证思路。正常的验证思路是:先验证是否完全匹配,否就提示错误。写法上,就是以^开头,然后以+$或*$或?$结尾。如果用逻辑表达式写即^(p),
而^(p) = (^p),那么,(^p)表示的是什么验证思路呢?

      只要找到不符合的,那么就提示错误。这种验证思路的写法,可以避免^+*?$等量词的使用。用例子来做说明吧,方便对比。比如验证只能输入数字:

 

//正常思维的写法
var exp = new RegExp();
exp = /^\d+$/;   
if( !exp.test("2a2") ){
    alert("只能输入数字");
    return false;
}
//逆向思维的写法
exp = /\D/;
if( exp.test("2a2") ){  //注意无感叹号
    alert("只能输入数字");
    return false;
}

 这个例子可以很清晰的说明区别了,从写法上看:逆向写法很简洁,没有+*?等数量量词,没有$结尾量词,一般也没有^开头量词(多条件的除外),并且if验证中,不再用""判断。下面再举几个例子,就更好看出逆向写法的简洁性了。为了简洁,不再写出if判断: 

 

//只能输入数字:
exp = /^[0-9]+$/;  //入门级的菜鸟写法
exp = /^\d+$/;  //使用量词的写法 
exp = /\D/;	//改进

//只能字母
exp = /^[a-zA-Z]+$/; //一般写法
exp = /[^a-zA-Z]/;	//改进

//只能输入单词字符(字母数字或_)
exp = /^[a-zA-Z0-9\_]+$/	//入门级的菜鸟写法
exp = /^\w+$/;	//使用量词的写法
exp = /\W/;	//改进

//只能输入单词字符(字母数字或_),并且不以数字开头
exp = /^[a-zA-Z]\w*$/;	//一般写法
exp = /\W|^\d/;	//改进

         看出逆向写法的简洁性了吧?对此我进行了一些总结,不过发现,逆向写法的适用范围郁闷不大哎!像邮箱地址等某位必须固定的有顺序问题的多条件的正则表达式,用逆向写法反而可能会变得非常复杂了!如果不考虑顺序问题:^(pq)=(^p)|(^q)(三个或三个以上的省略)还可以接受,而如果考虑顺序问题(比如邮箱地址@有顺序问题),那几乎都不可写了!像上面的最后一个例子,如果所有条件都可以转为简单的量词,那么可以进行优化,如果不是,那就不要使用逆向写法了。当然,用逆向写法写多条件的表达式,阅读上也会引起理解上的问题。故:单条件的正则,或可转为简单量词的多条件正则,均可优化为逆向写法!

 

 

编辑了下,添加了附件,经理说总结的东西都写成ppt方便培训和交流。