iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >正则表达式高级用法之分组的使用教程
  • 889
分享到

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

2024-04-02 19:04:59 889人浏览 泡泡鱼
摘要

目录分组的使用场景分组的使用方法捕获组分组的使用实例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 需要进行转义

小结

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

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

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


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
	}
}

总结

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

--结束END--

本文标题: 正则表达式高级用法之分组的使用教程

本文链接: https://www.lsjlt.com/news/167841.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 正则表达式高级用法之分组的使用教程
    目录分组的使用场景分组的使用方法捕获组分组的使用实例javascript 获取分组内容java 获取分组内容小结补充:正则表达式分组及常见的方法总结分组的使用场景 在书写正则表达式时...
    99+
    2022-11-13
  • Python 正则表达式的高级用法
    对于Python来说,学习正则就要学习模块re的使用方法。本文将展示一些大家都应该掌握的高级技巧。 编译正则对象 re.compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有...
    99+
    2022-06-04
    高级 正则表达式 Python
  • Python正则表达式的使用教程
    这篇文章主要介绍“Python正则表达式的使用教程”,在日常操作中,相信很多人在Python正则表达式的使用教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python正则表达式的使用教程”的疑惑有所帮助!...
    99+
    2023-06-16
  • python3正则表达式的几个高级用法
    一、 概述 本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于 1、复杂网页文件中的有用数据 例如,采用爬虫技术取得网页后,对网页内任何数据进...
    99+
    2023-01-31
    几个 高级 正则表达式
  • 正则表达式分组与引用的使用
    目录0.写在前面1.分组与编号2.不保存子组3.分组引用4.查找与替换 查找替换5.在文本编辑器中使用查找替换6.写在最后0.写在前面 今天我们来讲下正则中的分组与引用,其...
    99+
    2022-11-12
  • C++使用正则表达式的详细教程
    目录正则表达式RE库组件正则表达式的使用regex迭代器类型smatch相关操作子表达式子表达式用于数据验证子匹配操作regex_replace总结 正则表达式 正则表达式...
    99+
    2022-11-13
  • SQL正则表达式及mybatis中使用正则表达式的方法
    小编给大家分享一下SQL正则表达式及mybatis中使用正则表达式的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql...
    99+
    2022-10-18
  • python正则表达式re.search()的基本使用教程
    1 re.search() 的作用: re.search会匹配整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None  从源码里面可以看到re.search()方...
    99+
    2022-11-12
  • Python之正则表达式常用语法实例分析
    正则表达式概述正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功...
    99+
    2023-05-14
    Python
  • C#正则表达式之Ismatch()的用法解读
    目录C#正则表达式之Ismatch()1.IsMatch()方法2.RegexOptions枚举3.Spilt()方法C#正则表达式编写及验证方式正则表达式验证总结C#正则表达式之I...
    99+
    2023-05-18
    C#正则表达式 C# Ismatch()用法 C#正则表达式Ismatch()
  • 正则表达式regexp_replace的使用方法
    目录前言常用案例总结前言 regexp_replace的使用非常灵活,且容易忘记,故做此笔记。 没有过多的介绍使用说明,只是根据个人理解列出很多相似案例,个人觉得通过对比,...
    99+
    2022-11-13
  • Javascript中replace方法与正则表达式的结合使用教程
    目录概要replace方法基本介绍案例说明字符串关键字高亮显示Mustache插值总结概要 在前端开发过程中,字符串的replace方法在数据处理中非常常用。本文通过一个关键字高亮显...
    99+
    2022-11-13
  • Python语法学习之正则表达式怎么使用
    这篇文章主要介绍“Python语法学习之正则表达式怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python语法学习之正则表达式怎么使用”文章能帮助大家解决问题。要想成功的进行字符串的匹配需...
    99+
    2023-06-30
  • Python语法学习之正则表达式的使用详解
    目录正则表达式中的特殊字符正则表达式的使用正则小案例 - 1正则小案例 - 2正则小案例 - 3要想成功的进行字符串的匹配需要使用到正则表达式模块,正则表达式匹配规则以及需要被匹配的...
    99+
    2022-11-10
  • Java正则表达式——group方法的使用
    目录Java正则表达式——group方法例子Demo1例子Demo2Java正则表达式校验实例1 通过正则表达式制作短信模板2 正则表达式校验身份证总结Jav...
    99+
    2023-01-01
    Java正则表达式 group方法 Java group方法
  • Java 中使用正则表达式的方法
    本篇文章给大家分享的是有关Java 中使用正则表达式的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用RegexString.with(string).pattern(p...
    99+
    2023-05-31
    java 正则表达式 ava
  • java中如何使用正则表达式中的组
    这篇文章主要介绍java中如何使用正则表达式中的组,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!组是括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,组号1表示从左到右被第一个括号扩起的组,...
    99+
    2023-06-02
  • Notepad++使用正则表达式匹配的方法
    目录Notepad++ 使用正则表达式匹配一、常见匹配1、正则表达式匹配以某字符开头的这一行数据2、正则表达式匹配以a字符串开头,b字符串结尾的字符,中间不管3、只匹配纯数字的字符串...
    99+
    2023-05-15
    Notepad++正则表达式匹配 正则表达式匹配
  • python正则表达式之re.match()与re.search()的用法及区别
    目录1、re.match()的用法2、re.search()的用法3、re.match()与re.search()的区别1、re.match()的用法 re.match()方法是从起...
    99+
    2022-11-11
  • Python正则表达式的使用方法是什么
    这篇文章主要讲解了“Python正则表达式的使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python正则表达式的使用方法是什么”吧!什么是正则表达式简而言之,正则表达式(re...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作