js 正则 exec() 和 match() 数据抽取

转载地址:js 正则 exec() 和 match() 数据抽取 去看看

js 的正则表达式平常用的不多,但以前抽取数据的时候用到过,主要是有这样的需求;

var text='<td class="data">2014-4-4</td><br /><td class="data">2014-4-5</td>';
//希望输出 ["2014-4-4", "2014-4-5"]

难倒不难,如何比较好的实现是个问题;

如果要提取其中的数据,主要就是 String 对象的 match()、replace()、split() 方法或者 RegExp 对象的 exec(),但是应用的时候,还是有点坑的;

首先写出正则,这个不难,一个非全局,一个全局:

var re = /<td[^>]*?>([\s\S]*?)<\/td>/,reg = /<td[^>]*?>([\s\S]*?)<\/td>/g;

但是匹配多个 <td></td> 的时候,match 方法有点特殊:

match 的特殊在于:

非全局正则,可以返回捕获组,也就是正则里面()里面的内容,但不能多次匹配;

全局正则,可以多次匹配,但不返回捕获组;

实际上,如果全局正则,多次匹配还返回捕获组的话,返回的数据就不可能是个简单数组了,因为 n 次匹配,m 个捕获组,那返回的结果就是,数组里有 n 个匹配结果,每个匹配结果里,还要放一个数组,用来表示每个捕获组的值;

如果换成 exec(),结果如下:

exec() 特殊在于:

不管正则是否加全局,返回的内容是一样的

具体实现:

1、这里,我们先用 match 实现一遍,按照前面的思路,就是用全局正则 match 一下,然后再遍历获取到的数组,通过非全局正则捕获我们要的东西:

text.match(reg).map(function(v) {return v.match(re)[1];
});
//返回 ["2014-4-4", "2014-4-5"]

比较好理解,但是需要两个正则,一个全局,一个非全局;

2、如果用 exec(),

var temp = [],data = [];
while ((temp = reg.exec(text)) !== null) {data.push(temp[1]);
}
//data:["2014-4-4", "2014-4-5"]

这样写的原因是,RegExp 对象的方法,经常有 lastIndex 的属性,exec() 在执行的时候,实际上每回只匹配一次,然后改了 lastIndex 属性的值为下一个开始的地方,然后下次从新的地方开始再匹配,如果匹配到末尾匹配不到了,返回 null ,举个例子:

这个特性不注意会被坑的,比如:

var reg=/ja/g,text='ja';
reg.test(text); //true reg.lastIndex 返回 2,其实也就是匹配到末尾了
reg.test(text); //false reg.lastIndex 返回 0,匹配到末尾没匹配到,返回 null,lastIndex 重置为 0;

参考资料:

JavaScript权威指南-第6版

JavaScript高级程序设计-第3版

行文仓促,如有错误,欢迎批评指正~~~
转载请注明来源,文中所提文档可以在我的 Github 上下载~~~

js 正则 exec() 和 match() 数据抽取相关推荐

  1. 前端开发:JS中exec()和match()的对比使用

    前言 在前端开发过程中,关于正则表达式的相关使用想必开发者并不陌生,而且也算是一个比较常用的知识点,尤其是在邮箱.手机号判断校验的时候是必备知识点,但是一般情况下遇到这种校验场景就是去找现有的正则表达 ...

  2. js正则中的match()

    在前端开发中,正则表达式是一大利器.所以我们这次就来讨论下match()方法. match本身是JavaScript语言中字符串对象的一个方法,该方法的签名是 match([string] | [Re ...

  3. js正则表达exec和match的区别(转)

    转自:http://blog.csdn.net/fushou/article/details/6934608 以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多, ...

  4. html js 数量正则,js正则匹配多个全部数据问题

    需求:获取所有title里的内容 正则表达式后面加g表示多次匹配 方式一:match 返回数组 方式二 exec var str='OOOT BAORJCT 174296 22mm 10yard/lo ...

  5. 浅谈 js 正则字面量 与 new RegExp 执行效率

    前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化篇>. 里面讲到了优化正则起到提升性能的问题,但是能提升多少 ...

  6. js 正则验证数字(整数,货币型,浮点型)

    本文章提供一款js 正则验证数字(判断是否为数字)哦,他可以验正整数,货币型,浮点型数据哦,也很好的验证了js判断是不是数字的代码哦. 货币型 function isvaliddecimal(char ...

  7. js 正则中冒号代表什么_JS正则表达式一条龙讲解(从原理和语法到JS正则)

    正则啊,就像一座灯塔,当你在字符串的海洋不知所措的时候,总能给你一点思路:正则啊,就像一台验钞机,在你不知道用户提交的钞票真假的时候,总能帮你一眼识别:正则啊,就像一个手电筒,在你需要找什么玩意的时候 ...

  8. python正则提取mysql中文数据

    要对mysql中的中文数据做正则匹配,就想用python,简单实用,不过碰到中文乱码问题,各种搜索,折腾了好久,总算解决了,基本上的原则就是转为utf8编码. 具体为从表中的"title&q ...

  9. vue.js中mock本地json数据

    vue.js中mock本地json数据 新版本的vue项目中已经将dev-server.js,dev-client.js两个js文件合并到了webpack.dev.conf.js文件中,以下分别是新旧 ...

  10. 常用JS正则匹配函数

    //校验用户名:只能输入1-30个字母 function isTrueName(s) { var patrn=/^[a-zA-Z]{1,30}$/; if (!patrn.exec(s)) retur ...

最新文章

  1. 命令行的艺术 (GitHub 星标 6 万多)
  2. 驱动设计的思想:面向对象/分层/分离
  3. quill鼠标悬浮 出现提示_外设报道——DELUX多彩M618X垂直鼠标颠覆创新
  4. 深入Java集合系列之五:PriorityQueue
  5. reactor使用方法_Project Reactor展开方法
  6. java 程序增加 防盗_防盗Java EE –保护Java EE企业应用程序的安全
  7. 余承东:鸿蒙系统将与科大讯飞开放平台共同推动AI商业化
  8. aj6 stamps storm_曝光! “渣男”Travis Scott的AJ6下周发售,分手后货量大减...
  9. 从被动到主动,换个角度看 DB
  10. 王者服务器维修2019年四月份,王者荣耀4月25日更新内容 王者荣耀2019年4月25日全服不停机更新公告...
  11. 8255A的工作方式控制字
  12. Ubuntu16.04安装卸载MongoDB
  13. 学习.net设计规范记录
  14. 软件架构设计思维导图
  15. 程序员为了讨好大舅子,竟自学自动化编程
  16. 杜绝采购欺诈:利用SRM系统监控采购计划
  17. 关于深度学习(deep learning)
  18. lanyu 激活idea
  19. Chrome保存的知乎网页,本地打开后闪频刷新问题处理
  20. 被巨头、快递、新贵分食的跨境电商

热门文章

  1. 计算机导论大一知识点整理_电网计算机类考试?悄悄告诉你一个复习攻略!
  2. xml property标签注入一个类变量_java开发两年,连Spring的依赖注入的方式都搞不清楚,你工作可能有点悬!...
  3. oracle 游标详解
  4. 【数据结构】堆的手动模拟实现
  5. 使用js实现鼠标放置时显示下拉列表
  6. 后缀表达式----栈
  7. php连接mysql字符串函数_mysql 字符串函数
  8. 提交太多oracle,急!!请教 用文本域向数据库oracle提交不了太多文字如何解决??...
  9. 图:乐清市首届民工艺术节闭幕式暨才艺表演决赛圆满结束_渤锐软件提供了【评委打分公开展示】技术支持
  10. java rt.jar的源代码的位置