正确使用带有"g"标记的javascript正则表达式

 更新时间:2009年05月29日 20:50:15   作者:  
javascript正则表达式是对字符串执行模式匹配的强大工具。正确使用它会给我们的工作带来很大的便利。可是有些地方由于我们没有太注意或者根本不理解,就会遇到不可预料的麻烦。
下面我们要谈谈带有"g" 标记的正则表达式的使用问题,首先让我们看一段代码,从例子入手更容易理解。
复制代码 代码如下:

1 function a(val)
2 {
3 var re = /^\d+$/g;
4 alert(re.lastIndex);
5 return re.test(val);
6 }
7 alert(a(5));
8 alert(a(6));

运行上述代码,在不同浏览器中会得到不同结果,IE中:0 true 0 true,FF和Chrome中:0 true 1 false,看到这里,想必会有人一头雾水,感到诧异。针对这个问题,就我目前查阅资料,找到了两种方法。

1、使用match

复制代码 代码如下:

1 function a(val)

2
3 {
4
5 var re = /^\d+$/g;
6
7 if((""+val).match(re))
8
9 return true;
10
11 else
12
13 return false;
14
15 }
16
17 alert(a(5));
18
19 alert(a(6));

注:要使用""+val把val转化为字符串,关于match的具体使用方法可参考这里

2、使用不带"g" 的正则表达式(var re=/^\d+$/或var re=new RegExp("^[0-9]+$"))


复制代码 代码如下:

1 function a(val)
2
3 {
4
5 var re = new RegExp("^[0-9]+$");//或者var re=/^\d+$/;
6
7 return re.test(val);
8
9 }
10
11 alert(a(5));
12
13 alert(a(6));
14
15


注:var re = new RegExp("^[0-9]+$")中只能用[0-9],不能用\d,至于为什么,我不很明白,希望哪位知道的给讲讲。

不难看出,上面两种方法是从侧面考虑怎么解决问题 的,没有从正面解决,接下来我们从问题出现的本质上分析一下,并给出解决方法。

要从问题出现的本质考虑,我们就不得不从"g" 标记说起,带有"g"标记的正则表达式有一个属性lastIndex,该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置。上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。该属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。看到这里我们不难看出问题出现的原因和解决方法了,只要我们在下次搜索之前把lastIndex属性重置为0即可,如下:


复制代码 代码如下:

1 function a(val)
2
3 {
4
5 var re = /^\d+$/g;
6
7 re.lastIndex=0;//重置lastIndex为0
8
9 return re.test(val);
10
11 }
12
13 alert(a(5));
14
15 alert(a(6));


关于lastIndex的更多解释请看这里

至此我们已经明白问题出现的本质,以及如何较好的解决这样的问题,希望本文对一些人有帮助。

相关文章

  • 正则表达式匹配0-10的正整数以及使用细节

    正则表达式匹配0-10的正整数以及使用细节

    我们可以使用正则表达式来代表一些我们希望的字符串类型,比如正整数,下面这篇文章主要给大家介绍了关于正则表达式匹配0-10的正整数以及使用细节的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 收集整理ASP.NET中17种常用正则表达式

    收集整理ASP.NET中17种常用正则表达式

    正则表达式在程序开发中的应用非常广泛,本文给大家分享了asp.net中17种常用的正则表达式,需要的朋友可以参考下
    2015-09-09
  • 最新密码验证正则表达式

    最新密码验证正则表达式

    这篇文章主要为大家分享了最新密码验证正则表达式,密码形式可以根据开发需求进行设定,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 正则表达式的语法

    正则表达式的语法

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等
    2006-09-09
  • 使用正则表达式判断密码强弱

    使用正则表达式判断密码强弱

    本文给大家分享使用正则表达式来判断密码强弱的实例代码,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-06-06
  • JavaScript中常用的正则表达式日常整理(全)

    JavaScript中常用的正则表达式日常整理(全)

    本篇文章是小编日常整理有关js常用的正则表达式,比较全面,对大家学习javascript正则表达式非常有用,需要的朋友一起学习吧
    2015-09-09
  • javascript正则表达式分析

    javascript正则表达式分析

    想必很多人都对正则表达式都头疼。今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式来和大家分享学习经验。
    2008-05-05
  • 浅谈正则表达式回溯陷阱

    浅谈正则表达式回溯陷阱

    日常编程经常会用到正则表达式,躲不开这个陷阱,本文主要介绍了浅谈正则表达式回溯陷阱,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • js正则解析URL参数示例代码

    js正则解析URL参数示例代码

    URL参数使用js正则解析具体实现代码如下,有需求的朋友可以参考下,希望对大家有所帮组
    2013-08-08
  • JavaScript正则表达式校验非零的正整数实例

    JavaScript正则表达式校验非零的正整数实例

    本文分享了JavaScript正则表达式(^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$)校验非零的正整数实例代码,代码简单易懂,需要的朋友可以看下
    2016-12-12

最新评论