js正则全局匹配时获取捕获组

来源:互联网 发布:win10 数据恢复 编辑:程序博客网 时间:2024/06/05 19:53

在看js高程时,发现一个问题,js正则可以获取捕获组,但是只能获取一个,加上全局匹配时,就不能获取捕获组,,,这就很让人头疼了,如图:

我需要获取两个 td 标签里的日期,用正则 match ,对于需要捕获的区域,用 ([\s\S]*?)去捕获:

image

var str='<td class="data">2014-4-4</td><br /><td class="data">2014-4-5</td>';var matches=str.match(/<td[^>]*?>([\s\S]*?)<\/td>/);matches;

初看起来很正常,那我们如果两个都抓呢?那就要全局匹配,加上 g ;

image

大家前后对比下,很明显不行,捕获失败,,,

为什么会失败呢,其实我觉得可以理解,因为这里匹配到了两处(matches[0],matches[1]),那两处各自有一个捕获区域(catches[0],catches[1]),那这个返回数组里如果有捕获区域的话,就应该有四项:

[matches[0],catches[0],matches[1],catches[0]]

在这里就是:

["<td class="data">2014-4-4</td>", "2014-4-4","<td class="data">2014-4-5</td>", "2014-4-5"]

那咱们再发散下,匹配可能有多项,捕获也可能有多项,那这样,这个数组里如果都有捕获区域的话,那返回的数组最终应该是这样:

[matches[0],catches[0],catches[1]……catches[n],matches[1],catches[0],catches[1]……catches[n],matches[2],catches[0],……………matches[m],catches[0],……….catches[n]]

如果是这样,问题就来了,,,这个返回的数组是不是很难读,也很难操作?

那么js就没有办法全局匹配同时捕获数据嘛?

咦,我想到了一个很蠢的方法,可以一试,,,

用上面的例子来测试,代码就是这样的:

var str='<td class="data">2014-4-4</td><br /><td class="data">2014-4-5</td>';var matches=str.match(/<td[^>]*?>([\s\S]*?)<\/td>/g);var matches2=matches.toString().replace(/<td[^>]*?>([\s\S]*?)<\/td>/g,"$1").split(",");

看看效果,是不是呀?

image

代码可以简化下,就是这样:

var str='<td class="data">2014-4-4</td><br /><td class="data">2014-4-5</td>';var reg=/<td[^>]*?>([\s\S]*?)<\/td>/g;var data=str.match(reg).toString().replace(reg,"$1").split(",");

原理嘛,很简单啦,测试测试就明白啦:

image

还要上张图,解释下 replace:js高级程序设计,第145页,关于 replace 方法的第二个参数的使用

image

这里就是,先获取到所有的 mathces 数组,然后转为字符串,用 catches 替换 matches ,这样就只有 catches 了,然后通过split把他们通过分隔符,转为数组,本来数组转为字符串也是默认通过,分割

的嘛;

0 0
原创粉丝点击