【Java】正则表达式分组匹配

本文介绍了Java正则表达式中的分组匹配概念,通过示例解释了如何使用小括号创建子表达式以重复匹配多个字符,并展示了分组在IP地址匹配等场景的应用,强调了分组在正则表达式中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分组匹配:

正则表达式分组:
如果想匹配3个数字,正则表达式可以用如下写法:

\d{3}

以上代码使用重复量词可以匹配3位数字。
但是在实际应用中,往往需要重复多个字符,例如我想重复ab两个字符,使用以下代码就不合适了,代码如下:

ab{3}

以上正则表达式只能够重复3次b。
为了实现重复多个字符可以使用小括号来指定子表达式或者说分组来实现此功能,例如:

(ab){3}

上面的正则就可以重复ab了。
所谓的分组就是使用小括号将一些项包括起来,使其成为独立的逻辑域,那么就可以像处理一个独立单元一样去处理小括号的内容。

下面看一段代码实例:

(\d{1,3}\.){3}\d{1,3}

上面是一个简单的ip匹配正则表达式。由小括号包裹的内容会被作为一个独立的逻辑域进行操作。
分组的作用:
在正则表达式中,分组具有举足轻重的作用,下面就简单对它的功能做一下简单的介绍。

       /**
		 * 分组匹配
		 * 
		 */
		@Test
		public void test6() {
			String regex = "(%)(.*?)(%)";//()表示分组
			String str = "%akhscgaijgs% %dgqydfwydf% %aswdd%";
			
			System.out.println(str.replaceAll(regex, "$2"));//$表示组,$2表示组2
			System.out.println(str.replaceAll(regex, "$1aaaa$3"));
		}
		@Test
		public void test7() {
			Pattern pattern = Pattern.compile("(%)(.*?)(%)");//模式对象
			//pattern是模式对象,此方法会将匹配到的东西遍历出来
			String str = "%akhscgaijgs% %dgqydfwydf% %aswdd%";
			Matcher m = pattern.matcher(str);
			int i = 0;
			while(m.find()) {//find为从匹配的对象里面去查找
				i++;
				System.out.println(m.group(1) + " aaa "+ m.group(3) + " startIndex"+m.start()+",endIndex:" + m.end());
				//此处为输入的为所替换的组号,,而将其他组号替换出来
			}
		}
### Java 正则表达式分组使用方法 在Java中,正则表达式分组主要用于捕获特定部分的字符串以便后续处理。这通常涉及到`java.util.regex.Pattern`和`java.util.regex.Matcher`两个核心类[^2]。 #### 创建模式对象 为了定义一个带有分组正则表达式,首先需要创建一个`Pattern`实例: ```java import java.util.regex.*; // 定义带有一对圆括号作为分组标记的正则表达式 Pattern pattern = Pattern.compile("(\\d{3})-(\\d{4})"); ``` 上述代码片段展示了如何编译一个简单的电话号码格式化器,其中每一对圆括号代表了一个独立的分组,用于捕捉三位数区号和四位数本地号码[^4]。 #### 构建匹配器并执行查找操作 接着利用该模式构建一个`Matcher`对象,并尝试找到输入字符串中的所有匹配项: ```java String input = "拨打123-4567或者890-1234"; Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println("完整匹配:" + matcher.group(0)); System.out.println("第一个分组:" + matcher.group(1)); // 输出区号 System.out.println("第二个分组:" + matcher.group(2)); // 输出本地号码 } ``` 这段程序会遍历整个字符串序列,对于每一个符合条件的结果都会打印出来相应的整体匹配结果以及各个分组内的具体内容。 #### 替换指定分组内容 除了提取数据外,还可以基于这些分组来进行字符串替换工作。比如下面的例子演示了怎样只保留首次出现的那个重复字符: ```java String textWithRepeats = "aaabbbcccdddeeefff"; System.out.println(textWithRepeats.replaceAll("(.)\\1+", "$1")); // 结果为abcdef ``` 此段脚本运用到了反向引用的概念——即通过`$n`的形式访问之前已经成功匹配过的第N个子表达式所对应的文本[$4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值