`
西北小强
  • 浏览: 345047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用正则表达式匹配时遇到的一个怪异问题

阅读更多

前两天用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="测试" onclick="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”其实就是每次都把这个正则表达式重新创建一下,跟你复制粘贴一下那个正则表达式一样。个人遇到的一个怪异问题,大家再次遇到的话注意一下,有那位高手知道原委的话就指点指点哦,祝大家工作愉快。
0
0
分享到:
评论
2 楼 syx278250658 2013-10-10  
http://hi.baidu.com/django_master/item/76189614c2cc460fd1d66d06
http://www.oschina.net/question/141557_46091

这里面有原因
1 楼 sp42 2013-01-25  
RegExp 的静态属性 lastIndex 要复位,试试
var ifTag;
ifTag = /\d+/g;
ifTag.lastIndex = 0;
if(ifTag.test(tpl) === true){
  ……
}

相关推荐

    ExtJS判断IE浏览器类型的方法

    然后定义了一个名为check的函数,它接受一个正则表达式作为参数,并返回一个布尔值,指示用户代理字符串是否与正则表达式匹配。这一函数本质上是一个简化版的正则表达式测试函数。 紧接着,代码会进行一系列的判断...

    《你必须知道的495个C语言问题》

    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...

    你必须知道的495个C语言问题

    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 声明问题 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 *1.26 main的正确定义是什么...

    C语言FAQ 常见问题列表

    o 4.10 如果我不使用表达式的值, 我应该用 ++i 或 i++ 来自增一个变量吗? o 4.11 为什么如下的代码 int a = 100, b = 100; long int c = a * b; 不能工作? o 4.12 我需要根据条件把一个复杂的表达式赋值给两个...

    Javascript的IE和Firefox兼容性问题集合

    为确保兼容,可以创建一个跨浏览器的事件处理函数,如: ```javascript function addEvent(element, event, handler) { if (element.addEventListener) { element.addEventListener(event, handler, false); } ...

    PHP函数rtrim()使用中的怪异现象分析

    然而,在实际使用中,如果不完全理解其工作原理,可能会遇到一些看似“怪异”的现象。本文将深入探讨这些现象,并提供解决方法。 首先,`rtrim()`函数的基本用法是接受两个参数:需要处理的字符串和一个可选的字符...

    你必须知道的495个C语言问题(PDF)

    3.10 如果我不使用表达式的值, 我应该用++i 或i++ 来自增一个变量 吗? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.11 为什么如下的代码int a = 100, b = 100; long int c = a * b;...

    PHP架构师 指南 设计

    POSIX正则表达式相对简单,支持基本的正则匹配功能;而Perl正则表达式更为强大和灵活,支持更多的特性和语法结构。 **Safe_mode打开后的限制** - 文件上传路径受限。 - 运行的脚本只能访问特定目录下的文件。 - ...

Global site tag (gtag.js) - Google Analytics