正则表达式高级用法: 分组

  • 分组的使用场景
  • 分组的使用方法
  • 捕获组
  • 分组的使用实例
    • javascript 获取分组内容
    • java 获取分组内容
  • 小结

分组的使用场景

在书写正则表达式时,通常情况下,我们有两种场景会使用到分组。
一是:对一个子表达式进行重复;二是:想要获取到子表达式匹配到的内容。

  • 对子表达式进行重复

如果需要重复单个字符,直接在字符后面加上限定符即可,例如 a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a。
但是我们如果要对多个字符进行重复的话,就需要用到 分组
比如:(ab){3} 表示 ab 字符重复3次

正则中常用的限定符如下:

表达式 说明
X ? X ,一次或一次也没有
X * X ,零次或多次
X + X ,一次或多次
X { n } X ,恰好 n
X { n ,} X ,至少 n
X { n , m } X ,至少 n 次,但是不超过 m
  • 获取到子表达式匹配到的内容

比如表达式: [a-z]*\d*[a-z]*,它表示a-z的字符重复0到多次,后面紧跟0到多个数字,后面再跟上多个a-z的字符。
显然,字符串 abcd324232efg 是满足匹配的串。那么,如果我们只想要获取到匹配串中数字 324232 后面的串 efg 呢?

这时,就可以通过分组的方式来改写正则表达式: [a-z]*\d*([a-z]*)。这样,我们就可以通过获取第 1 个分组匹配到的内容来达到目的。

分组的使用方法

正则中通过小括号“()”来指定需要重复的子表达式,然后再加上限定符对这个子表达式进行重复。

例如:(abc)? 表示0个或1个abc 。
一组括号里面的表达式就表示一个分组 。

捕获组

分组可以分为两种形式,捕获组非捕获组

捕获组和非捕获组的区别就是:捕获组表示的分组会捕获文本(即:匹配字符),而非捕获组表示的分组不会捕获文本。

捕获组可以通过从左到右计算其开括号来编号
例如,在表达式 (A)(B(C)) 中,存在四个这样的组:

分组编号 分组编号对应的子表达式
0 (A)(B(C))
1 (A)
2 (B(C))
3 (C)

注意:第0个分组始终代表整个表达式

分组的序号可以通过 Back 引用(反向引用) 在表达式中使用,也可以在匹配操作完成后从匹配器检索出分组匹配到的内容。
反向引用的知识将会在后续的文章中进行分析。

分组的使用实例

在一个完整的正则中,如果我们只想获取到某个子表达式匹配到的内容,就可以通过分组来达到目的。

比如:
待匹配串:abcd324232efg
想要获取到这个字符串中第二次连续出现的字母子串efg

我们可以通过分组的方式书写正则: [a-z]*\d*([a-z]*)
可以看到,我们通过子表达式([a-z]*)来匹配第二次连续出现之母的子串,并且通过()添加了分组,这样,我们就可以通过分组来获取到相应的匹配内容了。

具体的获取方法不同的语言的语法可能会有差异,但是原理是相通的。
下面就来看一下 javascript 和 java 中是如何进行处理的?

javascript 获取分组内容

var str = "abcd324232efg";
var reg = new RegExp("([a-z]*)(\\d*)([a-z]*)");
var arr = str.match(reg);
// 显示匹配到的分组内容
alert(arr[0] + "===" + arr[1] + "===" + arr[2] + "===" + arr[3]);
alert(RegExp.$1 + "-----" + RegExp.$2 + "----" + RegExp.$3);

上面的例子中,我添加了 3 个分组。
通过 arr[n]RegExp.$n 的方式都能获取到分组匹配内容。

在 javascript 中 \d 需要进行转义

java 获取分组内容

public static void main(String[] args) {String str = "abcd324232efg";Pattern pattern = Pattern.compile("([a-z]*)(\\d*)([a-z]*)");Matcher matcher = pattern.matcher(str);if (matcher.find()) {System.out.println(matcher.group());System.out.println(matcher.group(0));System.out.println(matcher.group(1));System.out.println(matcher.group(2));System.out.println(matcher.group(3));}
}

在 java 中,通过 Matcher.group(n) 的方式拿到分组匹配内容。

在 javascript 中 \d 需要进行转义

小结

分组通常有两种使用场景:一是:对一个子表达式进行重复;二是:想要获取到子表达式匹配到的内容。

分组是通过 () 来表示的,它是通过从左到右计算其开括号来进行编号的。

更加系统的学习正则表达式的知识,请点击视频讲解:
正则表达式从入门到高手: https://edu.51cto.com/sd/59587


文章,请关注公众号: 老王学源码

正则表达式高级用法: 分组相关推荐

  1. JAVA正则表达式高级用法(分组与捕获)

    2019独角兽企业重金招聘Python工程师标准>>> 正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了.这里主要讲解一下 ...

  2. java 正则高级应用_JAVA正则表白式高级用法(分组与捉拿).

    ((A)(B(C)))/A(B(C))(C) 组零始终代表全副表白式 之因而这么命名捉拿组是因为在相称中,保留了与这些组相称的输入序列的每个子序列.捉拿的子序列稍后能够穿越 Back 引用在表白式中利 ...

  3. 正则表达式高级用法【原】

    开发过程中的真实场景 A报文 <?xml version="1.0" encoding="utf-8"?> <PACKET><HE ...

  4. 正则高级用法-分组group+替换

    public static void main(String[] args) {Pattern patternTest=Pattern.compile("c\\(a\\)\\(t\\(2\\ ...

  5. python3.7正则表达式语法_python3正则表达式的几个高级用法

    python3正则表达式的几个高级用法 一. 概述 本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于 1.复杂网页文件中的有用数据 例如,采用爬虫技术取得网页后,对网页内任 ...

  6. sed的基本用法和高级用法

    sed 的详细用法 sed:stream editor 流编辑器 sed的工作模式:sed是一个行文本编辑器,默认每次处理文本中所匹配到一行内容到模式空间,然后用后面的命令进行操作,操作完成之后,会把 ...

  7. javascript replace高级用法

    在前端与后台交互的时候我们通常都需要将后台传递的数据绑定到html中,这个绑定数据的方式我们通常是使用jQuery或者使用原生的innerHTML进行绑定,当然也可以使用artTemplate模板来绑 ...

  8. Note++ 常用功能高级用法

    最近开发过程中sqlserver转oracle的时候出现了大量的工作重复的问题,因此经常使用到note++,下面来记录下开发过程中常用的功能 ctrl+c ctrl+v ctrl+s 等常用的自然不用 ...

  9. python基础和第三方库 笔记(python基础完结包括高级用法,第三方库持续更新中...)

    python基础 注:本笔记面向有一定基础的人 本笔记是本人快速复习python过程中记录的,不适合零基础的人学习python的主工具,可以作为辅工具,本笔记记录了入门阶段常用操作,如有错误的地方,希 ...

  10. js replace不改变原str_总结javascript replace高级用法

    详解javascript replace高级用法 在前端与后台交互的时候我们通常都需要将后台传递的数据绑定到html中,这个绑定数据的方式我们通常是使用jQuery或者使用原生的innerHTML进行 ...

最新文章

  1. AI一分钟|潘建伟团队首次实现18个量子比特纠缠;特斯拉第二季度共交付40740辆汽车...
  2. 如何刪除GitHub中的repository
  3. [论文泛读]Web服务组合综述相关论文1(3篇)
  4. ASP.NET Core之跨平台的实时性能监控
  5. tomcat启动卡住
  6. Java-消息框显示两整数加减乘除
  7. python read函数报错_python 使用read_csv读取 CSV 文件时报错
  8. 软件架构——设计原则
  9. 数据结构与算法python—1.数据结构与算法入门
  10. WIN10家庭版自动锁屏解决方案
  11. bobsmith电路阻抗原理_网络变压器的介绍分类及工作原理
  12. dos u盘测试软件,u盘DOS启动盘制作工具(BootFlashDos)
  13. Java对接微信支付预下单
  14. RK3399 hi3559A 平台离线语音识别、合成、翻译、声纹
  15. 学习笔记(15):C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流-opencv播放rtsp海康摄像头和播放系统摄像头...
  16. Codeforces 1292C Xenon's Attack on the Gangs
  17. 百家号不收录限流无推荐阅读为零抄袭的解决方法!
  18. 2019/12/31 教养
  19. PandoraBox登录无法后台,出现/usr/lib/lua/luci/dispatcher.lua:461(2021-12-19亲测)
  20. 如何实现ArrayList的线程安全

热门文章

  1. 选票统计 SDUT
  2. ☀️光天化日学C语言☀️(09)- 算术运算符 | 小学就会了?温故而知新,可以为师矣!
  3. 网站优化之robots文件详解
  4. js文件 格式_robots文件只能放在网站根目录吗?
  5. (附源码)springboot学生宿舍管理系统 毕业设计 211955
  6. excel交互式图表
  7. 计算机网络实验-网络嗅探器
  8. uniapp的苹果全屏播放再退出会导致页面字体变大解决方法
  9. 低功耗蓝牙(BLE)开发——如何妥善处理包大小(MTU)限制
  10. 1、电脑鼠标右键反应慢,解决办法