热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正则表达式捕捉组

PS:浏览此篇文章前须要具有以下学问:正则表达式的基础语法String​.prototype​.replace()String​.prototype​.match()捕捉组(cap

PS: 浏览此篇文章前须要具有以下学问:

  1. 正则表达式的基础语法
  2. String​.prototype​.replace()
  3. String​.prototype​.match()

捕捉组(capturing group)是正则表达式里比较常常运用,也是比较主要的观点,我个人以为控制这部份的学问是非常主要的。
这篇文章内容不会很深切,然则只管做到简朴易懂又周全。接下来的内容主如果缭绕以下7个点:

1: () 捕捉组
2: (?:) non capturing group
3: (?=) positive lookahead
4: (?!) negative lookahead
5: (?<=) positive lookbehind
6: (?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); //true
RegExp.$1; //10
RegExp.$2; //25
RegExp.$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); //true
RegExp.$1; //25
RegExp.$2; //2017
originString.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: (?
负向就是与正向相反,那末负向后顾型捕捉就是:

/(?<=y)x/ 婚配x, 然则只在【前面】【没有】y的状况下

来看一个例子:

let str = "1 turkey costs $2";
console.log( str.match(/(?

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在$的前面。

PS:截止到目前为止(ES2015),Javascript还不支撑后顾型婚配,就是说(?<=), (?

推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
mobiledu2502901317
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有