JavaScript正则表达式进阶指南
摘要:正则表达式是程序员的必备技能,想不想多学几招呢?
本文用JavaScript的exec方法来测试正则表达式。
例如,正则表达式/F.*g/会匹配“以F开头,以g结尾的字符串”,因此可以匹配"Hello, Fundebug!"中的Fundebug,exec方法会返回一个数组,其第一个元素为所匹配的子字符串。
/F.*g/.exec("Hello, Fundebug!")[0] // 'Fundebug'
非贪婪匹配
默认情况下,正则表达式的量词*、+、?、{},都是进行贪婪匹配,即匹配尽可能多的字符。
例如,正则表达式/.+s/匹配的是“以空格符结尾的字符串”,我们用它来匹配苹果公司创始人乔布斯在斯坦福大学演讲的名言“You time is limited, so don’t waste it living someone else’s life.”:
/.+\s/.exec("You time is limited, so don’t waste it living someone else’s life.")[0] // 'You time is limited, so don’t waste it living someone else’s '
.可以匹配任意字符,而+表示匹配1次或者多次,且是贪婪的,因此/.+s/匹配到了最后一个空格符才结束。
当我们在量词*、+、?、{}后面紧跟着一个?,就可以实现非贪婪匹配,即匹配尽量少的字符。
例如,正则表达式/.+?s/匹配到第一个空格符就会结束:
/.+?\s/.exec("You time is limited, so don’t waste it living someone else’s life.")[0] // 'You '
正向肯定查找
使用正则表达式x(?=y),可以匹配'x'仅仅当'x'后面跟着'y'。这话有点绕,简单地说,就是匹配后面是y的x,这里的x和y都代表正则表达式。
例如,对于博客RabbitMQ入门教程的地址"https://blog.fundebug.com/2018/04/20/rabbitmq_tutorial/",如果需要匹配出域名fundebug的话,可以使用/[a-z]+(?=.com)/,匹配“在.com前面的英文单词”
/[a-z]+(?=\.com)/.exec("https://blog.fundebug.com/2018/04/20/rabbitmq_tutorial/")[0] // 'fundebug'
广告:欢迎免费试用Fundebug,为您监控线上代码的BUG,提高用户体验~
正向否定查找
与正向肯定查找所对应的是正向否定查找,使用正则表达式x(?!y),可以"匹配'x'仅仅当'x'后面不跟着'y'"。
例如,小学生都知道的圆周率是3.1415926,不会的同学可以这样记“山顶上有一座寺庙,寺庙里面有一壶酒,还有一块肉”。如何匹配小数点后面的数字呢?可以使用/d+(?!\.)/,匹配"后面没有小数点的数字":
/\d+(?!\.)/.exec("3.1415926")[0] // '1415926'
而使用之前提到的正向肯定查找,就可以匹配小数点前面的数字:
/\d+(?=\.)/.exec("3.1415926")[0] // '3'
多行匹配
下面是鲍勃·迪伦的《Forever Young》歌词:
May God bless and keep you always, may your wishes all come true, may you always do for others and let others do for you. may you build a ladder to the stars and climb on every rung, may you stay forever young, forever young, forever young, May you stay forever young.
如何匹配以forever开头的那句歌词forever young, forever young呢?
这样写/^forever.+/是错误的:
/^forever.+/.exec("May God bless and keep you always,\nmay your wishes all come true,\nmay you always do for others\nand let others do for you.\nmay you build a ladder to the stars\nand climb on every rung,\nmay you stay forever young,\nforever young, forever young,\nMay you stay forever young.") // null
为什么错了?因为^匹配的整个字符串的开始,而是不是每一行的开始。
正则表达式指定m选项,即可支持多行匹配,这时^和$匹配的是每一行的开始和结束,因此正确的正则表达式是/^forever.+/m:
/^forever.+/m.exec("May God bless and keep you always,\nmay your wishes all come true,\nmay you always do for others\nand let others do for you.\nmay you build a ladder to the stars\nand climb on every rung,\nmay you stay forever young,\nforever young, forever young,\nMay you stay forever young.")[0] // 'forever young, forever young,'
捕获括号
在正则表达式中使用小括号(),可以提取出字符串中的特定子串。
例如,Fundebug是在2016年双11正式上线的,时间是"2016-11-11",如何提取其中的年、月、日呢?如下:
/(\d{4})-(\d{2})-(\d{2})/.exec("2016-11-11") // [ '2016-11-11', '2016', '11', '11', index: 0, input: '2016-11-11' ]
可知,3个小括号中的正则表达式分别匹配的是年月日,其结果依次为exec返回数组中的1到3号元素。
参考
版权声明
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/05/02/advanced_regular_expression/

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Ubuntu安装JDK
一. Ubuntu 安装JDK的两种方式 1. 通过apt安装. 2. 通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 二. 通过apt安装(jdk有很多版本, 这里介绍两种: openjdk和oracle的JDK) 1. openjdk (1) 查找合适的openjdk版本: apt-cache search openjdk 输入以上命令后会列出很多版本, 选择自己需要的即可: default-jdk-doc - Standard Java or Java compatible Development Kit (documentation) …(省略部分显示结果) openjdk-6-source - OpenJDK Development Kit (JDK) source files openjdk-7-jre-dcevm - Alternative VM for OpenJDK 7 with enhanced class redefinition openjdk-7-jre-lib - OpenJDK Java r...
- 下一篇
9本R语言书,从入门到进阶都在这了
大数据现在有多热门?在朋友和同事里私下问一圈,发现10个同事中就有7个,正打算或者已经开始了自学数据分析。 虽然Python 在数据科学中一直打压 R 语言,但是很多迹象表明,R语言依然在数据科学和统计分析方面占有一席之地。最近的一份调查表明,几乎半数的数据科学家依然经常使用R语言。 近期异步社区最新上架了两本R语言,小编带大家了解一下R语言书,从入门到进阶,都在这了。 最新上架 R语言之书:编程与统计 书名:《R语言之书:编程与统计》 作者:[新西兰]蒂尔曼·M. 戴维斯(Tilman M. Davies) 译者:李毅 编辑推荐: 《R语言编程艺术》双子星, R语言入门到实战指南 一部翔实的百科全书式的R语言宝典 本书是一本指导你如何掌握并灵活运用目前世界上流行的统计分析编程语言——R语言的图书。即使你没有编程背景,或者只有少量的数学基础知识,也可以通过本书中丰富的实际案例,高效地学习统计学和R语言。 本书从基础知识,如处理数据、编写简单程序开始讲起,然后介据的统计概要、统计建模等。此外,你还将通过R语言的基本作图工具和贡献包(如ggplot2和ggvis)学习令人耳目一新的数据可视...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境