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

      只讨论验证方面的。
    首先,验证方法可有二种,正则的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方便培训和交流。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值