Java 正则表达式-捕获分组和非捕获分组 12

分组()简介:

捕获分组:后续还要继续使用本组数据。
正则内部使用:\组号
正则外部使用:$组号
非捕获分组:分组后不在使用本组数据,仅仅把数据括起来
(? : 正则):获取所有 例:Java(? : 8|11|17) 结果:Java8或Java11或Java17
(? = 正则):获取前面部分 例:Java(? = 8|11|17) 结果:8、11、17版本的Java
(? ! 正则):获取不是指定内容的前面部分 例:Java(? : 8|11|17) 结果:除了8、11、17版本的Java
细节:如何识别组号?
只看左括号,不看右括号,按照左括号的顺序,从左往右,依次为第一组,第二组,第三组等等

捕获分组代码演示:

//需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
//举例: a123a b456b 17891 &abc& a123b(false)
// \\组号:表示把第X组的内容再出来用一次
String regex1 = "(.).+\\1";
System.out.println("a123a".matches(regex1)); //true
System.out.println("b456b".matches(regex1)); //true
System.out.println("17891".matches(regex1)); //true
System.out.println("&abc&".matches(regex1)); //true
System.out.println("a123b".matches(regex1)); // false
System.out.println("--------------------------");


//需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
//举例: abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)
String regex2 = "(.+).+\\1";
System.out.println("abc123abc".matches(regex2)); //true
System.out.println("b456b".matches(regex2)); //true
System.out.println("123789123".matches(regex2)); //true
System.out.println("&!@abc&!@".matches(regex2)); // true
System.out.println("abc123abd".matches(regex2)); //false
System.out.println("---------------------");

//需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
//举例: aaa123aaa bbb456bbb 111789111 &&abc&&
//(.):把首字母看做一组
// \\2:把首字母拿出来再次使用
// *:作用于\\2,表示后面重复的内容出现0次或多次
String regex3 = "((.)\\2*).+\\1";
System.out.println("aaa123aaa".matches(regex3)); //true
System.out.println("bbb456bbb".matches(regex3)); //true
System.out.println("111789111".matches(regex3)); //true
System.out.println("&&abc&&".matches(regex3)); //true
System.out.println("aaa123aab".matches(regex3)); //false

捕获分组练习

需求:
将字符串:我要学学编编编编程程程程程程。
替换为:我要学编程

代码实现:

String str = "我要学学编编编编程程程程程程";

//需求:把重复的内容 替换为 单个的
//学学                学
//编编编编            编
//程程程程程程        程
//  (.)表示把重复内容的第一个字符看做一组
//  \\1表示第一字符再次出现
//  + 至少一次
//  $1 表示把正则表达式中第一组的内容,再拿出来用
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);

非捕获分组代码演示:

//身份证号码的简易正则表达式
//非捕获分组:仅仅是把数据括起来
//特点:不占用组号
//这里\\1报错原因:(?:)就是非捕获分组,此时是不占用组号的。


//(?:) (?=) (?!)都是非捕获分组//更多的使用第一个
//String regex1 ="[1-9]\\d{16}(?:\\d|x|x)\\1";
String regex2 ="[1-9]\\d{16}(\\d Xx)\\1";
//^([01]\d|2[0-3]):[0-5]\d:[@-5]\d$

System.out.println("41080119930228457x".matches(regex2));
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小钟不想敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值