关于IE的RegExp.exec的问题

所属分类: 网络编程 / 正则表达式 阅读数: 373
收藏 0 赞 0 分享
代码如下:
复制代码 代码如下:

var st="A[B]C[D]E[F]G";
var reg =/\[\w\]/ig;
var s1 = st.replace(reg,"");
var s2=[];
var arr;
while((arr=reg.exec(st))!=null)s2.push(arr[0]);
alert(s1);
alert(s2.join(""));


FF下正确显示,IE下S2为空.

网上查不到资料,请各位指点一二.

查询过程中得了个意外收获
复制代码 代码如下:

var st="A[B]C[D]E[F]G";
var reg =/\[\w\]/ig;
var s1 = st.replace(reg,"");
var s2=[];

var arr;
while((arr=/\[\w\]/ig.exec(st))!=null)s2.push(arr[0]);
alert(s1);
alert(s2.join(""));

该写法IE死循环RegExp的lastIndex没有得到更新

In some recent code, I'm using Javascript to parse through the result set of an AJAX call, which happens to be returning a full HTML page. Yes, ideally, I'd have an AJAX call return something usable like JSON, but in this case the PHP back-end code had to remain as is and the front-end adjust to handle the legacy HTML it returned.
I needed to grab a link (1 or more) from the returned HTML page so that I could immediately display those links in separate windows (each was a generated report). So, my first stab at this is shown in the following code example. Basically, we have setup a string to represent the returned HTML, in this case it contains 3 <a> links; and we want to use the standard Javascript RegExp object's exec() method to grab the URLS (href parameter) for each of those links. In our example, we just print them out in an unordered list to see what we've captured. The important lines of code we'll be looking at are highlighted in the example below.
复制代码 代码如下:

var s='<a href="x">X</a>\n<a href="y">Y</a>\n<a href="z">Z</a>\n';
document.write('Found the following link URLs in the string:<br/><ul>');
while (matches = /<a href=['"](.*)['"]>.*<\/a>/g.exec(s)) {
document.write('<li>' + matches[1] + '</li>\n');
}
document.write('</ul>');

Which, when run, we get the following results in Firefox/Safari/Chrome:
Found the following link URLs in the string:
x
y
z
Our while loop using RegExp.exec() on our in-line regular expression does what it's supposed to and continues to match from where it left off in the string giving us our captured portion in the matches[] array. However, when run in Internet Explorer, we get the following lovely result (at least up until IE tells us the script is no longer responding and asks us to kill it):
Found the following link URLs in the string:
x
x
x
x
x
x
x
x
x
…ad infinitum…
Obviously, we have generated an infinite loop using our code above in IE; but why? The issue is that IE doesn't correctly maintain the lastIndex member for the regular expression object each iteration through the loop. Each time through the loop, which if you look at the highlighted code is in-lined, IE creates a new RegExp object and hence resets the lastIndex member to the beginning of the string. Therefore, we match the first link in the string infinitely as the lastIndex pointer never progresses between matches. There is a way around this, and that is to declare the regular expression separately, outside the loop, (it gets created just once) and then call exec() on that singular RegExp object as follows:
复制代码 代码如下:

var rx = /<a href=['"](.*)['"]>.*<\/a>/g;
var s='<a href="x">X</a>\n<a href="y">Y</a>\n<a href="z">Z</a>\n';
document.write('Found the following link URLs in the string:<br/><ul>');
while (matches = rx.exec(s)) {
document.write('<li>' + matches[1] + '</li>\n');
}
document.write('</ul>');

Now, the lastIndex member of our RegExp object gets updated correctly and we get the results we expected. Somewhat related to this item is the following interesting lastIndex bug in IE with zero-length matches. Hopefully, this will save someone a headache when trying to debug using Javascript RegExp.exec().
更多精彩内容其他人还在看

正则表达式——匹配规则介绍

这篇文章主要介绍了正则表达式——匹配规则介绍,需要的朋友可以参考下
收藏 0 赞 0 分享

JavaScript 中的正则表达式(推荐)

正则表达式通常用于在文本中查找匹配的字符串,js正则表达式在程序开发中应用非常广泛,本文给大家介绍JavaScript 中的正则表达式(推荐),感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

Java正则表达式入门基础篇(新手必看)

这篇文章给大家介绍java正则表达式入门基础篇, 由于正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。感兴趣的朋友一起跟着小编来看看吧
收藏 0 赞 0 分享

linux正则表达式awk详解

这篇文章主要介绍了linux正则表达式awk的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

notepad++ 等用正则表达式自动添加sql引号的技巧

本篇文章给大家介绍notepad用正则表达式自动添加sql引号的技巧,,需要的朋友可以参考下
收藏 0 赞 0 分享

常见的正则表达式问题

这篇文章主要介绍了常见的正则表达式问题,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux正则表达式特性详解及BRE与ERE的异同点

本篇文章给大家介绍linux正则表达式特性及BRE与ERE的不同,Linux正则表达式(Regular Expression)主要遵从POSIX BRE或者POSIX ERE标准,对linux正则表达式感兴趣的朋友可以参考下本篇文章
收藏 0 赞 0 分享

Linux下如何使用grep命令查找带有tab(退格)的字符

本文给大家介绍linux下如何使用grep命令查找带有tab(退格)的字符,涉及到linux grep 查找带有tab的字符方面的知识,对linux grep tab感兴趣的朋友可以参考下本篇文章
收藏 0 赞 0 分享

WEB开发时常用的正则表达式(PHP和Javascript)

这篇文章主要介绍了WEB开发中最常用最实用的正则表达式及其用法,需要的朋友可以参考下
收藏 0 赞 0 分享

比较全面的C 、Java、JavaScript中的正则表达式详解

正则表达式(Regular Expression) 就是用某种模式去匹配一类字符串的公式。本篇文章给大家介绍C 、Java、JavaScript中的正则表达式,本文介绍的非常全面,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享
查看更多