正则表达式分组实例详解
正则表达式分组:
如果想匹配3个数字,正则表达式可以用如下写法:
\d{3}
以上代码使用重复量词可以匹配3位数字。
但是在实际应用中,往往需要重复多个字符,例如我想重复ab两个字符,使用以下代码就不合适了,代码如下:
ab{3}
以上正则表达式只能够重复3次b。
为了实现重复多个字符可以使用小括号来指定子表达式或者说分组来实现此功能,例如:
(ab){3}
上面的正则就可以重复ab了。
所谓的分组就是使用小括号将一些项包括起来,使其成为独立的逻辑域,那么就可以像处理一个独立单元一样去处理小括号的内容。
下面看一段代码实例:
(\d{1,3}\.){3}\d{1,3}
上面是一个简单的ip匹配正则表达式。由小括号包裹的内容会被作为一个独立的逻辑域进行操作。
分组的作用:
在正则表达式中,分组具有举足轻重的作用,下面就简单对它的功能做一下简单的介绍。
一.起到原始的分组作用:
把单独的项目进行分组,以便合成子表达式,这样就可以像处理一个单独的字符那样,对其应用|、+、*或者?等元字符来操作它们。
实例代码如下:
var str="I love javascript and java"; console.log(str.match(/java(script)?/gi));
由以上代码的运行结果可以看出,正则表达式既可以匹配字符串javascript也可以匹配java,这是因在正则表达式中采用了分组,并且使用重复量词?,可以使前面的子表达式重复0次或者1次。
二.定义子模式:
分组另一个非常重要的作用就是在完整的模式中定义子模式。
当一个正则表达式成功的和目标字符串相匹配时,可以从目标字符串中抽出和小括号中字表达式相匹配的部分。
假如我们匹配的是以一个数字开头的后面跟着一个或者多个不区分大小写的字母的字符串,正则表达式可以这样写:
/\d[a-zA-Z]+/
假如我们真正关心和需要的是开头的数字,那么就可以将正则表达式的数字部分放入小括号就可以从检索到的匹配中抽取数字.
/(\d)[a-zA-Z]+/
三.引用子表达式:
正则表达语法中可以在同一个表达式中的后部引用前面的子表达式。这是通过在"\"后面跟随数字实现的。此数字指定了小括号字表达式在正则表达式中的位置,例如\1是引用的第一个带有圆括号的子表达式,自然\2就是第二个带有圆括号的子表达式。
特别注意:由于子表达式是可以相互嵌套的,那么计算子表达式的位置的时候,只要确定左括号的位置即可。例如:
/(java(script))/
在以上正则表达式中,嵌套的子表示是可以用\2表示。
对于子表达式的引用,并不是引用的匹配模式,而是对子表示匹配内容的引用。一般来说对子表达式的引用一般是用来实施一条约束,看下面的代码:
/(['"])[^'"]*\1/
通常情况下左右引号是相匹配的,如果前面是双引号,那么结尾也要是双引号,前面是单引号那么结尾也必须是单引号,并且字符串中间不能够再出现其他的引号,例如:
"我们欢迎您"
'我们欢迎您'
那么上面的正则表达式就实现此功能,当前面的子表达式匹配单引号的时候,那么后面的\1也就表示的是单引号,如果子表示匹配的双引号,那么后面的\2就表示的是双引号。
非引用型分组:
分组会占用一定的系统资源,尤其是正则表达式较长的时候会降低匹配速度。有时候仅仅是为了设置一个分组,并不需要引用,那么使用非引用类型分组将会是一个良好的选择。
/(java(?:script))/
以上正则就是使用非引用分组,只要在左括号后面加上一个?:即可。
相关推荐
-
javascript正则表达式中分组详解
之前写了一篇关于正则新手入门的文章,本以为对正则表达式相对比较了解 但是今天我又遇到了一个坑,可能是自己不够细心的原因吧,今天就着重和大家分享一下javascript正则表达式中的分组.如果你对JS正则表达式不够理解 可以点击这里了解更多. 分组在正则中用的还是比较广的,我所理解的分组 就是一对括号() ,每一对括号 就代表了一个分组, 分组可以分为: 捕获性分组 非捕获性分组 捕获性分组 捕获性分组会在 比如 match exec这样的函数中以第二项,第三项的形式得到相应分组的结果.先来看一个
-
详解JavaScript正则表达式之分组匹配及反向引用
语法 元字符:(pattern) 作用:用于反复匹配的分组 属性$1~$9 如果它(们)存在,用于得到对应分组中匹配到的子串 \1或$1 用于匹配第一个分组中的内容 \2或$2 用于匹配第一个分组中的内容 ... \9或$9 用于匹配第一个分组中的内容 用法示例 var reg = /(A+)((B|C|D)+)(E+)/gi;//该正则表达式有4个分组 //对应关系 //RegExp.$1 <-> (A+) //RegExp.$2 <-> ((B|C|D)+) //RegExp.
-
JavaScript正则表达式的分组匹配详解
分组 下面的正则表达式可以匹配kidkidkid: /kidkidkid/ 而另一种更优雅的写法是: /(kid){3}/ 这里由圆括号包裹的一个小整体称为分组. 候选 一个分组中,可以有多个候选表达式,用|分隔: var reg = /I love (him|her|it)/; reg.test('I love him') // true reg.test('I love her') // true reg.test('I love it') // true reg.test('I love
-
JavaScript中使用正则匹配多条,且获取每条中的分组数据
不过我要面对的是一个很松散的HTML页面,无法XML 因此,本文的重点在于如果要获取的网页中有Table或List段落,需要将这些段落的信息按照列的方式保存到JS的数组中 直接贴代码: 复制代码 代码如下: var str = "字符串字符串<table><tr><th>ID</th><th>姓名</th><th>电话</th></tr><tr><td>01<
-
深入理解JS正则表达式---分组
深入理解JS正则表达式---分组 之前写了一篇关于正则新手入门的文章,本以为对正则表达式相对比较了解 但是今天我又遇到了一个坑,可能是自己不够细心的原因吧,今天就着重和大家分享一下javascript正则表达式中的分组.如果你对JS正则表达式不够理解 可以点击这里了解更多. 分组在正则中用的还是比较广的,我所理解的分组 就是一对括号() ,每一对括号 就代表了一个分组,分组可以分为: •捕获性分组 •非捕获性分组 捕获性分组 捕获性分组会在 比如 match exec这样的函数中以第二项,第三项
-
浅谈JavaScript正则表达式分组匹配
语法 元字符:(pattern) 作用:用于反复匹配的分组 属性$1~$9 如果它(们)存在,用于得到对应分组中匹配到的子串 \1或$1 用于匹配第一个分组中的内容 \2或$2 用于匹配第一个分组中的内容 ... \9或$9 用于匹配第一个分组中的内容 用法示例 var reg = /(A+)((B|C|D)+)(E+)/gi;//该正则表达式有4个分组 //对应关系 //RegExp.$1 <-> (A+) //RegExp.$2 <-> ((B|C|D)+) //RegExp.
-
PHP正则表达式的效率 回溯与固化分组
先来看下问题. 字符串 复制代码 代码如下: $str = '<script>123456</script>'; 正则表达式为 复制代码 代码如下: $strRegex1 = '%<script>.+<\/script>%'; $strRegex2 = '%<script>.+?<\/script>%'; $strRegex3 = '%<script>(?:(?!<\/script>).)+<\/scri
-
python正则分组的应用
复制代码 代码如下: import retext='V101_renow.Android.2.2.Normal.1.Alpha.apk?IMSI=460029353813976&MOBILE=&OLD_VERSION=renow.Android.2.1.Normal.1.Alpha&CHANNELID=3'm = re.search(r"\w+_(renow.*)\.(apk|vir|ipa)\?IMSI=(\d+)&MOBILE=&OLD_VERSION
-
JS正则表达式获取分组内容的方法详解
支持多次匹配的方式: 复制代码 代码如下: var testStr = "now test001 test002"; var re = /test(\d+)/ig; var r = ""; while(r = re.exec(testStr)) { alert(r[0] + " " + r[1]); } 此外也可以用testStr.match(re),但是这样的话就不能有g的选项,而且只能得到第一个匹配. 另外备忘
-
正则用(?>…)实现固化分组提高效率
具体来说,使用「(?>-)」的匹配与正常的匹配并无差别,但是如果匹配进行到此结构之后(也就是,进行到闭括号之后),那么此结构体中的所有备用状态都会被放弃(不能被回溯). 也就是说,在固化分组匹配结束时,它已经匹配的文本已经固化为一个单元,只能作为整体而保留或放弃.括号内的子表达式中未尝试过的备用状态都不复存在了,所以回溯永远也不能选择其中的状态(至少是,当此结构匹配完成时,"锁定(locked in)"在其中的状态). 例子: 比如要处理一批数据,原来格式为123.456,后来因
-
正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)
前面我们知道正则表达式有很多元字符表示匹配次数(量词),都是可以重复匹配前面出现的单个字符次数.有时候,我们可能需要匹配一组多个字符一起出现的次数.这个时候,我们需要分组了.就是用小括号来括起这些字符,指定子表达式(也叫做分组).然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作.这个时候,可以把括号中一组字符,看作一个整体了. 分组模式举例说明 如:查找字符串中,连续出现多个win字符串的字符.可以这样完 <?php $str = "this is win wi
-
javascript正则表达式之分组概念与用法实例
本文实例讲述了javascript正则表达式之分组概念与用法.分享给大家供大家参考,具体如下: function matchDemo(){ var s; //该表达式分了三个组:d(b+)(d).(b+).(d)这个三个组(实际上是四个组,包括本身所有的表达式) //从最左边数第一个括号为第一个组,第二个括号为第二组,以此类推,分别对应的值为RegExp.$1和RegExp.$2的值 var re = new RegExp("(d(b+)(d))","ig"); v
随机推荐
- python登录QQ邮箱发信的实现代码
- 详解JS中的this、apply、call、bind(经典面试题)
- asp.net 多文件上传,兼容IE6/7/8,提供完整代码下载
- awk简介与学习笔记收集第1/3页
- PHP 裁剪图片成固定大小代码方法
- php 从一个数组中随机的取出若干个不同的数实例
- 怎么运行用记事本写的java程序
- android IPC之binder通信机制
- js实现九宫格图片半透明渐显特效的方法
- PHP遍历并打印指定目录下所有文件实例
- c++ 指针与引用的区别介绍及使用说明
- 取选中的radio的值
- jQuery实现进度条效果代码
- JS实现中文汉字按拼音排序的方法
- 诱人视频请君入瓮 解析RealPlayer溢出漏洞
- 基于linux程序中段的学习总结详解
- 使用PHP求两个文件的相对路径
- Android 双击返回键退出程序的方法总结
- Android RecyclerView实现水平、垂直方向分割线
- 深入学习C语言中memset()函数的用法
其他
- 易语言支持库配置闪退
- vscode js 格式化缩进
- vue3.0 列表循环滚动
- r语言批量修改文件名
- springboot 停止服务 kill -9
- echarts有数据但是没渲染成功
- js滑动时间控件实现原理
- dataframe的一列怎么向下移动 CNDS
- jupyter导出的图片显示不出
- mysql installer8.0.23安装教程
- 使用python按文件名搜索文件
- 弹框 echarts获取不到dom
- idea datagrip SQL语法
- 布料模拟滤波算法流程图
- pyinstaller 打包成app找不到配置文件
- python中word存储save为97doc格式
- opencv 16位图 的浮雕算法效果
- java1.8查询部门树
- android答题实现
- pandas rolling 相减