我的正则表达式之“Hello,World!”

和正则表达式纠缠了两天,总算弄明白了关于正则表达式的大约2%内容,写出了我自己的第一个正则表达式(在JAVASCRIPT里叫做RegExp)。 主要是为了能在网页里验证文本框的输入,限制为必须如q+n+b+k+x这样的形式。 规则为: 1、不允许输入除了“qnbkx+”这六个字符以外的其他字符; 2、字母之间必须用+连接,长度不限但字母不能重复(连续或者非连续重复都不允许); 3、+可以重复但不允许以+开头; 4、+不允许连续重复如+++。 合法的输入示例如下: q+n、q、q+n+x、n+q+k+、x+ 非法的输入示例如下: +、+q(这两个都是以+开头) n+n、n+kk、q+n+k+n(n重复了,k重复了,n重复了) q++n(两个+连续重复) qk(字母之间必须用+连接) 就为了解决这个输入验证,我花了两个整天学正则表达式!! 在百度知道里也问了这个问题,一直没人回复。 后来还是自己解决,在文本框的onkeyup里用了个很笨的办法:每输入一个字就检查一遍上面那几个规则,把不符合规则的字符用replace替换掉。具体代码如下: //去掉开头的+和全部其他字符,去掉连续的字符 var thevalue=thetext.value.replace(/(^/+)|([^qnbkx/+])|([qnbkx]{2,})/g,''); //去掉间隔其他字符重复出现的q、n、b、k、x var tmpstr var firstpos firstpos=thevalue.search(/([qnbkx]).*/1/g); if (firstpos>-1){ tmpstr=thevalue.slice(0,firstpos) thevalue=tmpstr+thevalue.slice(firstpos+1,thevalue.length) } thevalue=thevalue.replace(/[/+]+/g,'+');//连续的多个+替换成一个 thevalue=thevalue.replace(/^/+/g,'');//再次检查和去掉开头的+ thetext.value=thevalue; 看上去有点晕吧?我自己也晕,写的代码运行正常检测通过,但是过段时间再来看代码自己都看不懂了。简单解释一下: 1、用“/”和“/”把正则表达式包含进去,后面跟个g代表全局匹配。 2、(^/+)|([^qnbkx/+])|([qnbkx]{2,})这段里用两个“|”把三个匹配项隔开,“|”表示逻辑或,跟or一个意思。 3、^和$分别代表字串开头和结尾。但是^也可以表示逻辑反,如^qnbkx/+就表示除了qnbkx+这几个字符以外的一切字符。其中的/+代表字符+(因为单独的+有别的含义)。 4、{2,}表示它前面的东西要重复至少2次或者更多次。 5、firstpos=thevalue.search(/([qnbkx]).*/1/g)这句是要找到字符串中重复两次的字母,并且把其中第一次出现的位置记录下来,然后把找到的重复字母的第一个去掉: if (firstpos>-1){//如果找到了重复字母。例如q+k+n+b+n+x,n重复了 tmpstr=thevalue.slice(0,firstpos);//把字串中第一个重复字母前的那部分保存到tmpstr,如q+k+ thevalue=tmpstr+thevalue.slice(firstpos+1,thevalue.length)//把重复字母第一次出现之后的部分+b+n+x和前面的连起来 } //结果为q+k++b+n+x,虽然把第一个n去掉了,但是形成了两个连续的+,没关系,后面还有代码thevalue=thevalue.replace(/[/+]+/g,'+')把连续的多个+换成一个。 由于是在onkeyup里执行这段代码,所以不用担心会出现一个字母重复3次以上,就用不着用while连续search和slice了。 (第二天我发现我这想法太天真了,如果存心构造个重复多次的字串粘贴进去,我的程序就乱套了,还是必须用while循环检测,把所有重复都去掉。不然,如果想偷懒的话……所谓的BUG和程序漏洞就是因此而产生的,大名鼎鼎而得意的hacker们也因此而得以存在……) 昨天晚上临睡前又想到可以用个正则表达式在提交FORM的时候用ASP再检查一遍最终的输入是否匹配: /^[qnbkx]{1}(/+[qnbkx]?)*(?!/+)$/ 不过不能检查出间隔重复的字母。除非再用另外一个正则表达式。 今天在百度知道里看到了有人回答了可以用/^([qnbkx]/+)*([qnbkx]|){1}$/来匹配,比我上面想到的那个简洁一些,但还是一样不能同时解决字母间隔重复的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值