深入浅析正则表达式 捕获组_正则表达式

来源:脚本之家  责任编辑:小易  

不要这么纠结,如果传进来的字符串是空,直接ruturn false吧www.zgxue.com防采集请勿采集本网。

捕获组(capturing group)是正则表达式里比较常用,也是比较重要的概念,我个人觉得掌握这部分的知识是非常重要的。

在正则中,小括号()表示捕获组 这个组,也就是在匹配的时候,将某一部分的字符(串)作为组处理,这个组,可以在正则表达式的其它位置或者匹配的结果中使用,如: \\s+([a-zA-Z]+?\\s.+$ 匹配\"abcd

这篇文章内容不会很深入,但是尽量做到简单易懂又全面。接下来的内容主要是围绕以下7个点:

[]不算一个捕获组 ()外的内容不算在捕获组当中,而且^+本来就不会被捕获… 举个例子: 123.456.789.\".replaceAll(\"^([^.]+\\\\.)+\",\"$1\") 字符串123.456.789.最后会被替换为789.因为捕获组$1最后

1: () 捕获组

1.捕获组及其编号: 1)捕获组之前讲过,就是匹配到的内容,按照()子表达式划分成若干组;2)例如正则表达式:(ab)(cd(ef))就有三个捕获组,没出现一对()就是一个捕获组 3)捕获组编号规则: i.引擎会对捕获

2: (?:) non capturing group

返回的没错啊,你哪想不通了 exec方法返回的结果是一个数组 生成的数组元素中索引为0的元素为匹配后的最终结果 生成的数组元素中索引为1的元素就是我们第一个子表达式所捕获的内容(括号内的内容) 生成的

3: (?=) positive lookahead

真正的研究好正则,其实没别的路,去看《精通正则表达式》,别的书都是白搭,这书是正则界的圣经,别被书的厚度吓倒,做为一个过来人,可以很负责任的告诉你,在你走通正则的那一天,你会发现,你的努力是

4: (?!) negative lookahead

5: (?<=) positive lookbehind

6: (?<!) negative lookbehind

7: (?=), (?!), (?<=), (?<!)的捕获

1: () 捕获组

/go+/

以上的正则表达式表示一个字母g后面跟上一个或者多个字母o,他能匹配go或者goooo。但是如果我们想+不只是运用到字母o上,而是运用到go这个整体上怎么办呢?办法就是给go加括号:

/(go)+/

为了全局匹配以及不考虑大小写,我们接下来会给我们的正则加上ig,这两个flag:

let reg = /(go)+/ig;'go is g gogo'.match(reg); //["go", "gogo"]

在上面的例子里面(go)就形成了一个捕获组(capturing group)。接下来看一个使用捕获组的例子来加深对它的理解:

let reg = /(\d{2}).(\d{2}).(\d{4})/;let originString = '10.25.2017';reg.test(originString); //trueRegExp.$1; //10RegExp.$2; //25RegExp.$2; //2017

在上面这个例子里,我们有三组括号,形成了三个捕获组,正则表达式(在javaScript里就是我们的RegExp)会缓存捕获组所匹配的串,以$n表示,n就代表这第几个捕获组。

假如现在我们有一个需求:把显示格式为 10.25.2017 的时间改为 2017-10-25 格式。

我们知道String的replace()方法经常和正则表达式一起使用。在replace()方法里,我们可以直接使用捕获组的结果:

let reg = /(\d{2}).(\d{2}).(\d{4})/;let originString = '10.25.2017';let newString = originString.replace(reg, '$3-$1-$2');console.log(newString);//"2017-10-25"

2: (?:) non capturing group 非捕获型分组

有的时候我们可能只想匹配分组,但是并不想缓存(不想捕获)匹配到的结果,就可以在我们的分组模式前面加上?:。例如上面的时间的例子,我们不想捕获第一个分组的结果,就可以这么做:

let reg = /(?:\d{2}).(\d{2}).(\d{4})/;let originString = '10.25.2017';reg.test(originString); //trueRegExp.$1; //25RegExp.$2; //2017originString.match(reg);// ["10.25.2017", "25", "2017", index: 0, input: "10.25.2017", groups: undefined]

从上面的例子可以看出,我们的正则表达式依然是匹配的(test()的结果依然为true),但是RegExp.$1不是数字10,而是25,因为我们在第一个括号里加了?:,10就不会被捕获。match()的执行结果也会受?:的影响:match()的结果里不再有‘10'。

3: (?=) positive lookahead 正向前瞻型捕获

有一个句子:1 apple costs 10. 我们想要匹配前面的价格(这里是一个数字),但是注意不能匹配到句子开头的数字1。这种情况,就可以用到正向前瞻型捕获:

let reg = /\d+(?=)/g;let reg1 = /\d+/g;let str = '1 apple costs 10';str.match(reg); //["10"]str.match(reg1); //["1", "10"]

上面的例子里面reg1就只需要匹配数字,对于数字后面跟什么并没有要求,所以它能匹配到1,10。但是reg使用了前瞻型匹配,就只能匹配到10。

或许你已经能从上面的对比里了解到什么是正向前瞻型捕获了,意思是:

/x(?=y)/ 匹配x, 但是必须在x的【后面】【是】y的情况下

4: (?!) negative lookahead 负向前瞻型捕获

上面我们了解了什么是正向前瞻型匹配,从字面意思也能猜出来负向前瞻型捕获就是:

/x(?!y)/ 匹配x, 但是必须在x的【后面】【不是】y的情况下

例如下面的例子,我们要匹配数字1,而不要前面的2,就可以用到?!:

let reg = /\d+(?!)/g;let str = '1 apple costs 2';str.match(reg); ['1']

5: (?<=) positive lookbehind 正向后顾型捕获

后顾型和前瞻型正好相反,意思就是:

/(?<=y)x/ 匹配x, 但是只在【前面】【有】y的情况下

来看一个例子:

let str = "1 turkey costs $2";console.log( str.match(/(?<=\$)\d+/g) ); //["2"]

这里的要求是前面有$的数字,所以这里匹配到了数字2,而没有1.

6: (?<!) negative lookbehind 负向后顾型捕获

负向就是与正向相反,那么负向后顾型捕获就是:

/(?<=y)x/ 匹配x, 但是只在【前面】【没有】y的情况下

来看一个例子:

let str = "1 turkey costs $2";console.log( str.match(/(?<!\$)\d+/g) ); //['1']

7: (?=), (?!), (?<=), (?<!)的捕获

默认情况下上面的前瞻后顾4种都是默认不匹配捕获组里面的内容的,也就是不匹配括号里的条件的。例如我们的正向前瞻/d+(?=)/g,只会匹配到数字,并不会匹配到。如果我们想要也匹配到怎么办呢?答案就是给也包上一个括号:

let str = "1 turkey costs 2";let reg = /\d+(?=())/; str.match(reg); //["2", "", index: 15, input: "1 turkey costs 2", groups: undefined]

这样就匹配到了数字2和它后面的。

下面再来看看后顾型:

let str = "1 turkey costs $2";let reg = /(?<=(\$|£))\d+/;console.log( str.match(reg) ); //["2", "$", index: 16, input: "1 turkey costs $2", groups: undefined]

需要特别注意到的一点是,对于后顾型,虽然条件在匹配项的前面,但是匹配出来的结果顺序依然是条件在匹配项的后面。所以这里match()出来的结果是2在$的前面。

总结

以上所述是小编给大家介绍的正则表达式 捕获组,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对真格学网网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

[不算一个捕获组()外的内容不算在捕获组当中,而且^+本来就不会被捕获…举个例子:"123.456.789.".replaceAll("^([^.]+\\\\.)+内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • php正则表达式之捕获组与非捕获组
  • php之正则表达式捕获组与非捕获组(详解)
  • 正则表达式之捕获组/非捕获组介绍
  • 正则表达式中的特殊字符
  • php 正则 email语句详解
  • 正则应用之 逆序环视探索 .
  • pblog2 公用js代码
  • 深入浅析正则表达式 捕获组
  • asp 图片正则 替换,替换前检查图片是不是本地地址的方法
  • 正则匹配的test函数
  • asp正则过滤重复字符串的代码
  • as3 js正则表达式 反向引用(backreference)
  • 常用的jquery数字类型验证正则表达式整理
  • 如何使用正则表达式的捕获组与非捕获组
  • 正则表达式捕获组如果为(?)的话...
  • Java正则表达式捕获组取消重复
  • 关于正则表达式中的组和捕获、构造
  • 正则表达式:()这个捕获组是什么意思?有什么特殊意义吗?
  • java正则表达式捕获组的问题"^([^.]+.)+" []中算一个捕获组吗,()外^+算在捕获组中吗
  • java正则表达式,捕获组重命名怎么搞
  • 关于JavaScript正则表达式捕获分组的一个问题,求解答
  • 怎么学好Linux中的正则表达式?本人正在摸索中,不是很顺利,望大哥们提些建议?
  • js的正则表达式的正则前瞻(?=)和非捕获性分组(?:)有什么区别?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页正则表达式php正则表达式之捕获组与非捕获组php之正则表达式捕获组与非捕获组(详解)正则表达式之捕获组/非捕获组介绍正则表达式中的特殊字符php 正则 email语句详解正则应用之 逆序环视探索 .pblog2 公用js代码深入浅析正则表达式 捕获组asp 图片正则 替换,替换前检查图片是不是本地地址的方法正则匹配的test函数asp正则过滤重复字符串的代码as3 js正则表达式 反向引用(backreference)常用的jquery数字类型验证正则表达式整理java 正则表达式详解比较正宗的验证邮箱的正则表达式正则表达式匹配任意字符(包括换最新手机号码、电话号码正则表达javascript 手机号码正则表达式验js利用正则配合replace替换指定字正则表达式匹配不包含某些字符串正则中需要转义的特殊字符小结js正则函数match、exec、test、s最全的常用正则表达式大全——包ios 中使用正则表达式判断身份证格式及银正则表达式详述 二java 正则表达式详解详解java中的正则表达式php和正则表达式教程集合之一匹配yyyy-mm-dd日期格式的的正则表达式最全的常用正则表达式大全正则表达式判定保留2位小数的实现代码表单验证常用正则(强烈推荐大家收藏下)[asp]中的正则表达式运用代码
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved