前两天用js匹配正则表达式时遇到一奇怪现象,第一次匹配的结果为true,而第二次的时候为false,让我纠结了半天最终找到原因了。我原先的代码是这样的
a=$("#test").val(); var str=/[*]/g //替换星号的正则表达式,有g表示全局匹配,否则只匹配一次 alert(str.test(a));//没别的意义,确定一下写的正则是否有问题 if(str.test(a)){ //进行其它处理 }
结果弹框一直true但是死活不执行if里边的代码,后来发现是if里的状态为false根本没进去,到现在也没想清楚为什么。
先看看下面的代码吧:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title> New Document </title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> </head> <script type="text/javascript" src="jquery-1.7.2.min.js"></script> <script> function test1(){ var a=$("#test").val(); var str=/[*]/g //替换星号的正则表达式,有g表示全局匹配,否则只匹配第一个 var b=a.replace(/as/g,"@") alert("第一次匹配:"+str.test(a)) alert("第二次匹配:"+str.test(a)) alert("第二次匹配:"+str.test(a)) </script> <body> <form method="post" action=""> <input type="text" name="" id="test"> <input type="button" value="测试" οnclick="test1()"> </form> </body> </html>
按照我们平时写代码的逻辑,如果含有‘*’三次弹出的结果都应该为true,但是这样匹配后的结果确出人意料,单击测试后发现弹出的结果为“第一次匹配:true”,“第二次匹配:false”,"第三次匹配:true"后至于是什么原因造成的我也不懂,反正大家用的时候注意一下。如果有哪位高手明白的话,还烦劳指点指点,我个人估计是跟正则表达式有关系,因为它也算是一种语言吧。不过我们有这样的需求的话可以把上面的代码这样改改:
alert("第一次匹配"+new RegExp(str).test(a)) alert("第二次匹配"+new RegExp(str).test(a)) alert("第二次匹配"+new RegExp(str).test(a))这样的话就跟我们预期的结果一样了,三次都弹出“true”其实就是每次都把这个正则表达式重新创建一下,跟你复制粘贴一下那个正则表达式一样。个人遇到的一个怪异问题,大家再次遇到的话注意一下,有那位高手知道原委的话就指点指点哦,祝大家工作愉快。