正则表达式捕获Java中的组和反向引用

捕获组是一种将多个字符视为一个单元的方法。通过将要分组的字符放在一组括号内来创建它们。例如,正则表达式(狗)创建一个包含字母“ d”,“ o”和“ g”的单个组。

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

((A)(B(C)))
(A)
(B(C))
(C)

现在有个需求是去除文章中重复的“<br/>”换行标签,希望只保留一个换行标签。

public static void main(String[] args) throws Exception {

		String str = "&nbsp;&nbsp;文章第一段文章第一段文章第一段文章第一段文章第一段。<br><br><br><br>&nbsp;&nbsp;文章第二段文章第二段文章第二段文章第二段文章第二段<br><br><br><br>&nbsp;&nbsp;文章第三段文章第三段文章第三段文章第三段文章第三段<br>";
		str = str.replaceAll("(\\s*<br\\s*/?>\\s*)\\1+", "\n<br/>\n");
		System.out.println(str);
	}

运行结果:

&nbsp;&nbsp;文章第一段文章第一段文章第一段文章第一段文章第一段。
<br/>
&nbsp;&nbsp;文章第二段文章第二段文章第二段文章第二段文章第二段
<br/>
&nbsp;&nbsp;文章第三段文章第三段文章第三段文章第三段文章第三段<br>

总结:

1.反向引用指的就是“\\1” 他表示前面括号里的 捕获组, 数字1表示第一个捕获组。 然后后面接+号,表示至少出现1次。加上前面括号的捕获组,即至少出现2次。

2.理解上面的含义就明白为什么运行结果中最后一个换行标签没被替换了。

因为是+号,所以必须出现2次才会进行替换的。

另外还可以在替换字符串中使用捕获组,与前面的“\\1”区别是,使用“$1”指代捕获组。例子:

System.out.println("123456789".replaceAll("(4)5(6)", "<p>$1</p>"));

输出结果是:

123<p>4</p>789

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值