我的编程空间,编程开发者的网络收藏夹
学习永远不晚

正则表达式高级用法之分组的使用教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

正则表达式高级用法之分组的使用教程

分组的使用场景

在书写正则表达式时,通常情况下,我们有两种场景会使用到分组。

一是:对一个子表达式进行重复;二是:想要获取到子表达式匹配到的内容。

  • 对子表达式进行重复

如果需要重复单个字符,直接在字符后面加上限定符即可,例如 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 需要进行转义

小结

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

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

补充:正则表达式分组及常见的方法


import java.util.Arrays;
public class RegexApply {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		demo1();
//		demo2();
//		demo3();
//		demo4();
//		demo5();
//		demo6();
	}
	private static void demo6() {
		
		String s = "我..我我...我....爱..爱爱爱....爱爱..学.学学..学学学...学习习..习...习.习.习......习习习习";
		String s2 = s.replaceAll("\\.+", "");
		String s3 = s2.replaceAll("(.)\\1+", "$1");	
		System.out.println(s3);
	}
	private static void demo5() {
		
		String s = "acyyfgttthjzzzzzko";
		String regex = "(.)\\1+";					//1+代表第一组出现一次到多次
		String[] arr = s.split(regex);
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
	private static void demo4() {
		
		//叠词  飘飘亮亮,美美丽丽
		String regex2 = "(.)\\1(.)\\2";					//\\1代表第一组又出现一次	\\2代表第二组又出现一次
		System.out.println("漂漂亮亮".matches(regex2));	//true
		System.out.println("美美丽丽".matches(regex2));	//false
		System.out.println("高高兴兴".matches(regex2));	//true
		System.out.println("死啦死啦".matches(regex2));	//false
		System.out.println("----------------------");
		//叠词 漂亮漂亮,美丽美丽
		String regex = "(..)\\1";
		System.out.println("死啦死啦".matches(regex));		//true			
		System.out.println("高兴高兴".matches(regex));		//true
		System.out.println("快快乐乐".matches(regex));		//false
	}
	private static void demo3() {
		
		String s = "aaoo1ddd3jgjao";
		String regex = "\\d";
		String s2 = s.replaceFirst(regex, "");
		String s3 = s.replaceAll(regex, "");
		System.out.println(s2);					//aaooddd3jgjao
		System.out.println(s3);					//aaoodddjgjao
	}
	private static void demo2() {
		
		String s = "星期一.星期二.星期三.星期四";
		String[] array = s.split("\\.");
		System.out.println(Arrays.toString(array));
	}
	private static void demo1() {
		
		String regex = "[1-9]\\d{5,15}";
		System.out.println("804360385".matches(regex));				//true
		System.out.println("430763075439703307503".matches(regex));	//false
		System.out.println("03534534".matches(regex));				//false
	}
}

总结

到此这篇关于正则表达式高级用法之分组使用的文章就介绍到这了,更多相关正则表达式分组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

正则表达式高级用法之分组的使用教程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python 正则表达式的高级用法

对于Python来说,学习正则就要学习模块re的使用方法。本文将展示一些大家都应该掌握的高级技巧。 编译正则对象 re.compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换
2022-06-04

Python正则表达式的使用教程

这篇文章主要介绍“Python正则表达式的使用教程”,在日常操作中,相信很多人在Python正则表达式的使用教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python正则表达式的使用教程”的疑惑有所帮助!
2023-06-16

python3正则表达式的几个高级用法

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

C#正则表达式之Ismatch()的用法解读

这篇文章主要介绍了C#正则表达式之Ismatch()的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-18

Java正则表达式——group方法的使用

这篇文章主要介绍了Java正则表达式group方法的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-01

Java 中使用正则表达式的方法

本篇文章给大家分享的是有关Java 中使用正则表达式的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用RegexString.with(string).pattern(p
2023-05-31

Python语法学习之正则表达式怎么使用

这篇文章主要介绍“Python语法学习之正则表达式怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python语法学习之正则表达式怎么使用”文章能帮助大家解决问题。要想成功的进行字符串的匹配需
2023-06-30

java中如何使用正则表达式中的组

这篇文章主要介绍java中如何使用正则表达式中的组,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!组是括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,组号1表示从左到右被第一个括号扩起的组,
2023-06-02

Notepad++使用正则表达式匹配的方法

这篇文章主要介绍了Notepad++使用正则表达式匹配的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-15

PHP 正则表达式函数的使用方法

php 正则表达式函数提供强大的文本处理能力,包括:preg_match:检查字符串中是否存在匹配模式。preg_match_all:获取字符串中所有匹配模式的数组。preg_replace:用替换文本替换字符串中的所有匹配模式。preg_
PHP 正则表达式函数的使用方法
2024-04-21

JS正则表达式的使用方法是什么

本篇内容主要讲解“JS正则表达式的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS正则表达式的使用方法是什么”吧!测试字符串是否合规这种特性常被用来检测前端输入的字段是否符合要求
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录