`
roway
  • 浏览: 52631 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Regex 量词Quantifier 分组group

阅读更多

1.量词Quantifier
a.作用:限定之前的字符出现的次数
b.形式:
1.*:之前的字符可以出现0次到无穷多次。
2.+:之前的字符至少需要出现1次。
3.?:之前的字符至多只能出现1次。
2.区间量词
a.作用:具体规定字符的出现次数
b.形式:
1.{min,max}
2.{min, }
3.{number}
4.*={0,}
5.+={1,}
6.?={0,1}
7.用\\d+验证数字字符串。
3.量词的局限
a.量词只能规定之前字符或字符组的出现次数
b.如果要规定一个字符串的出现次数,必须使用括号(...),在括号内填写字符串,在闭括号之后添加量词。
4.括号的用途:多选结构
a.字符组(这就是字符组[1234567890])只能表示某个位置可能出现的单个字符,而不能表示某个位置可能出现的字符串。
b.作用:表示某个位置可能出现的字符串
c.形式:
1.(...|...),在竖线两端添加各个字符串
2.(...|...|...|...)
5.括号的用途:捕获分组
a.作用:将括号内的子表达式捕获的字符串存放到匹配结果中,供匹配完成后访问

b.形式:使用普通的括号(...)

 

/**
 * 括号的用途:捕获分组
 * */
public class CaptureBasic {

	public static void main(String[] args) {
		String email = "webmaster@itcast.net";

		String regex = "(\\w+)@([\\w.]+)";
		//String regex = "(\\w+)@([\\w]+.[\\w]+)";//比较一下这种情况

		Pattern p = Pattern.compile(regex);

		Matcher m = p.matcher(email);

		if (m.find()) {
			//组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。 
			System.out.println("email add is:\t" + m.group(0));
			System.out.println("username is:\t" + m.group(1));
			System.out.println("hostname is:\t" + m.group(2));
			//System.out.println("exception is:\t" + m.group(3));
		}

	}

}

6.捕获分组的注意事项
a.只要使用了括号,就存在捕获分组
b.捕获分组按照开括号出现的从左至右的顺序编号,遇到括号嵌套的情况也是如此。

c.如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串。------注意掌握!

 

/**
 * 组的使用......掌握!!!
 * */
public class CaptureMind {
	public static void main(String[] args) {
		
		explainGroupNo();
		
		System.out.println("");
		
		explainGroupQuantifier();		

	}
	
	/**
	 * 第一个左括号是第一组...依此类推。
	 * */
	public static void explainGroupNo() {
		String email = "webmaster@itcast.net";

		String regex = "((\\w+)@([\\w.]+))";

		Pattern p = Pattern.compile(regex);

		Matcher m = p.matcher(email);

		if (m.find()) {
			System.out.println("match result:\t" + m.group(0));
			System.out.println("group No.1 is:\t" + m.group(1));
			System.out.println("group No.2 is:\t" + m.group(2));
			System.out.println("group No.3 is:\t" + m.group(3));
		}
	}
	
	/**
	 * 与上面方法中正则表达式的区别<br>
	 * 如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串。------注意掌握!
	 * */
	public static void explainGroupQuantifier() {
		String email = "webmaster@itcast.net";

		String regex = "(\\w)+@([\\w.])+";

		Pattern p = Pattern.compile(regex);

		Matcher m = p.matcher(email);

		if (m.find()) {
			System.out.println("match result:\t" + m.group(0));
			System.out.println("group No.1 is:\t" + m.group(1));
			System.out.println("group No.2 is:\t" + m.group(2));
		}
	}

}

7.不捕获文本的括号

 

a.如果正则表达式很复杂,或者需要处理的文本很长,捕获分组会降低效率。
b.作用:仅仅用来对表达式分组,而不把分组捕获的文本存入结果。

c.形式:(?:...)

 

/**
 * 不捕获文本的括号,形式:(?:...)------掌握!!!
 * */
public class NoCaptureParenthese {

	public static void main(String[] args) {
		String email = "webmaster@itcast.net";

		String regex = "(?:webmaster|admin)@(itcast.net)";

		Pattern p = Pattern.compile(regex);

		Matcher m = p.matcher(email);

		if (m.find()) {
			System.out.println("match result:\t" + m.group(0));
			System.out.println("group No.1 is:\t" + m.group(1));
		}

	}
}

8.括号的用途:反向引用

 

a.作用:在表达式的某一部分,动态重复之前的子表达式所匹配的文本。

b.形式:\1

 

/**
 *括号的用途:反向引用
 *a.作用:在表达式的某一部分,动态重复之前的子表达式所匹配的文本。
 *b.形式:\1 
 * */
public class BackReferenceBasic {
	public static void main(String[] args) {
		
		String[] strings = new String[] { "<h1>good</h1>", "<h1>bad</h2>"};
		
		String regex = "<(\\w+)>[^<]+</(\\1)>";//掌握!!!
		
		for (String str : strings) {
			if (str.matches(regex)) {
				System.out.println("\"" + str
						+ "\" can be matched with regex \"" + regex
						+ "\"");
			} else {
				System.out.println("\"" + str
						+ "\" can not be matched with regex \"" + regex
						+ "\"");
			}
		}

	}

}

研究下面一个问题:

 

public class BackReferenceReplace {
	public static void main(String[] args) {

		
		String dupWords = "word word";
		String dupWordRegex = "(\\w+)\\s+(\\1)";

		//以下两行是扩充的代码
		//String dupWords = "word word word word";
		//String dupWordRegex = "(\\w+)(\\s+(\\1))+";

		System.out.println("Before replace:\t" + dupWords);
		//根据java语句的规范,"$1"表示的是正则表达式中编号为1的分组所捕获的字符串......理解!!!
		System.out.println("After replace:\t"
				+ dupWords.replaceAll(dupWordRegex, "$1"));

	}

}


 

 

 

分享到:
评论

相关推荐

    javascript实现的一个最简的正则引擎

    if (regex.type === 'group') { const result = match(regex.children[0], input); if (result && result.matched) return result; if (regex.children.length &gt; 1) return match(regex.children[1], input); // ...

    正则表达式.rar

    5. **分组与捕获**:`group()`方法可以获取匹配的子串,`group(int group)`可以获取指定组号的子串。 进阶概念: 1. **预查(Positive lookahead)**:`(?=...)`确保匹配的字符串后面跟着特定的模式,但不包含在...

    卷料回转库sw20可编辑_三维3D设计图纸_三维3D设计图纸.zip

    卷料回转库sw20可编辑_三维3D设计图纸_三维3D设计图纸.zip

    前端分析-2023071100789s+7

    前端分析-2023071100789s+7

    电磁场仿真:瞬态电磁场仿真.zip

    电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。

    嵌入式开发中ADC数据采集的多种软件滤波算法及其STM32工程应用

    内容概要:本文详细介绍了嵌入式开发中常用的几种软件滤波算法,旨在解决ADC采集数据中的误差问题。文中首先解释了限幅滤波、中位值滤波、递推平均滤波、一阶滞后滤波以及消抖滤波的基本原理和应用场景,并提供了相应的C语言代码实现。接着讨论了这些算法在实际项目中的优化技巧,如使用环形缓冲区、DMA传输、Q格式定点数运算等。最后强调了根据不同场景选择合适的滤波算法组合的重要性。 适合人群:从事嵌入式系统开发的技术人员,尤其是那些需要处理ADC采集数据的工程师。 使用场景及目标:适用于各类嵌入式系统的数据采集模块,特别是面对传感器数据不稳定的情况。目标是在不改变硬件的前提下,通过软件手段提高数据的可靠性和准确性。 其他说明:文章不仅提供了理论知识,还分享了许多实践经验,帮助读者更好地理解和应用这些滤波算法。同时提醒开发者要注意硬件层面的噪声处理,不要过分依赖软件滤波。

    光伏混合储能VSG并网仿真模型:解析VSG控制与储能协同优化

    内容概要:本文详细介绍了光伏混合储能系统的虚拟同步发电机(VSG)并网仿真模型。该系统由VSG控制模块、光伏PV模块、蓄电池以及超级电容组成。VSG通过有功-频率环和无功-电压环进行精确控制,确保系统稳定运行。光伏模块采用MPPT扰动观察法跟踪最大功率点,蓄电池提供稳定的恒功率输出,超级电容则用于快速响应瞬态负载变化。文中展示了各个模块的核心代码逻辑及其在仿真环境中的表现,强调了参数整定对系统性能的影响。 适合人群:电力电子工程师、新能源研究人员、仿真建模专家。 使用场景及目标:适用于研究光伏混合储能系统的并网控制策略,优化储能设备的协同工作,提高系统的稳定性和响应速度。目标是通过仿真验证系统在各种工况下的性能,为实际应用提供理论支持和技术指导。 其他说明:文章提供了丰富的代码片段和仿真案例,帮助读者深入理解各模块的工作原理和相互关系。同时,作者分享了许多调试经验和常见错误,有助于新手更快掌握相关技术。

    (河南)土木工程毕业实习报告(高层住宅小区).doc

    (河南)土木工程毕业实习报告(高层住宅小区).doc

    电子烟多芯支架装配sw20可编辑_三维3D设计图纸_三维3D设计图纸.zip

    电子烟多芯支架装配sw20可编辑_三维3D设计图纸_三维3D设计图纸.zip

    大学毕业生土木工程毕业实习报告范文3000字(范本).doc

    大学毕业生土木工程毕业实习报告范文3000字(范本).doc

    一个纯原生JavaScript实现的轮播图,使用了面向对象的方式实现

    一个纯原生JavaScript实现的轮播图,使用了面向对象的方式实现。 如果你想锻炼自己的编码能力,可以尝试实现这样的一个轮播图。 如果你想在项目中使用,也是一个不错的选择,当然记得将缺少的图标素材补充完整。 如果你在一个页面上需要用到多个轮播图,那更应该使用它了。

    前端开发Vue框架安装与环境配置指南:涵盖Node.js、Vue CLI及项目创建运行全过程

    内容概要:本文详细介绍了 Vue.js 的安装及环境配置流程。首先强调了 Vue.js 作为渐进式 JavaScript 框架的特点,然后逐步讲解了安装 Node.js 和 Vue CLI 的步骤,包括下载、安装和版本检查。接着,演示了如何使用 Vue CLI 创建新项目,并介绍了项目创建后的运行方法。最后,简述了如何在 Vue 项目中安装常用的第三方依赖,如 Axios、Vue Router 和 Vuex,为后续开发做好准备。; 适合人群:对前端开发感兴趣的初学者或有一定 JavaScript 基础的开发者。; 使用场景及目标:①掌握 Vue.js 的安装和环境配置;②学会使用 Vue CLI 创建和运行 Vue 项目;③了解如何在 Vue 项目中安装和使用常用第三方依赖。; 阅读建议:按照文档步骤依次操作,确保每一步都正确无误,特别是 Node.js 和 Vue CLI 的安装与版本检查。在创建和运行项目时,注意终端输出的信息,遇到问题及时查阅官方文档或社区资源。

    电磁场仿真:电磁波传播仿真.zip

    电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。

    STM32-宿舍语音助手.zip

    STM32-宿舍语音助手.zip

    Xilinx FPGA千兆以太网与DDR4内存读写测试:基于KCU105/KC705平台的LWIP通信及DDR4读写工程代码

    内容概要:本文详细介绍了基于Xilinx KCU105/KC705平台的千兆以太网与DDR4内存读写测试工程代码。首先,文章讲解了LWIP轻量级TCP/IP协议栈的实现,包括网络接口初始化、内存池配置等。其次,探讨了DDR4内存控制器的设计,涵盖VHDL代码示例及其工作原理。最后,文章讨论了如何将这两部分整合到一个完整的工程项目中,解决了时钟域同步、资源分配和接口适配等问题,并展示了性能测试结果。 适合人群:从事FPGA开发的技术人员,尤其是关注高速数据处理和网络通信领域的工程师。 使用场景及目标:适用于需要实现高速数据传输和存储的应用场景,如实时数据采集、信号处理等。目标是掌握千兆以太网通信和DDR4内存读写的实现方法,提高系统的数据处理能力和稳定性。 其他说明:文中提供的代码片段和调试技巧有助于开发者快速上手并解决问题。此外,作者分享了许多实践经验,如PHY芯片配置、AXI总线优化等,对于初学者和有一定经验的开发者都有很大帮助。

    电大土木工程专业毕业论文31774.doc

    电大土木工程专业毕业论文31774.doc

    镍氢电池智能检测生产线sw17可编辑_三维3D设计图纸_三维3D设计图纸.zip

    镍氢电池智能检测生产线sw17可编辑_三维3D设计图纸_三维3D设计图纸.zip

    光伏储能充电Simulink仿真模型:详解恒流恒压及两阶段充电模式

    内容概要:本文详细介绍了基于Simulink平台构建的光伏储能充电仿真模型,涵盖了光伏发电模块、锂电池模型和充电控制策略的设计与实现。文中首先描述了整体架构,包括带MPPT的Boost电路用于光伏发电,二阶RC等效电路用于电池建模,以及充电控制模块中的三种充电模式(恒流、恒压、两阶段混合)及其切换逻辑。接着,作者分享了调试过程中遇到的一些常见问题及解决方案,如RC参数匹配不当引起的震荡、充电模式切换时的电流冲击、光伏输出与电池电压不匹配等问题。最后,通过对不同充电模式的仿真结果进行对比分析,展示了两阶段混合模式在充电效率和稳定性方面的优势。 适合人群:从事光伏储能系统研究与开发的技术人员,尤其是对Simulink仿真工具有一定基础的研究人员。 使用场景及目标:适用于希望深入了解光伏储能系统内部工作原理和技术细节的专业人士,旨在帮助他们掌握如何利用Simulink搭建高效稳定的充电控制系统,优化系统性能。 其他说明:文中提供了详细的参数设置指南和调试技巧,有助于读者快速上手并成功复现实验结果。同时,作者还分享了一些未公开的小技巧和隐藏功能,增加了模型的趣味性和实用性。

    前端分析-2023071100789s+12

    前端分析-2023071100789s+12

    电磁仿真:电磁场基础理论.zip

    电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。

Global site tag (gtag.js) - Google Analytics