Java分组匹配

简介: Java分组匹配

我们前面讲到的(...)可以用来把一个子规则括起来,这样写learn\s(java|php|go)就可以更方便地匹配长字符串了。


实际上(...)还有一个重要作用,就是分组匹配。


我们来看一下如何用正则匹配区号-电话号码这个规则。利用前面讲到的匹配规则,写出来很容易:


\d{3,4}\-\d{6,8}


虽然这个正则匹配规则很简单,但是往往匹配成功后,下一步是提取区号和电话号码,分别存入数据库。于是问题来了:如何提取匹配的子串?


当然可以用String提供的indexOf()和substring()这些方法,但它们从正则匹配的字符串中提取子串没有通用性,下一次要提取learn\s(java|php)还得改代码。


正确的方法是用(...)先把要提取的规则分组,把上述正则表达式变为(\d{3,4})\-(\d{6,8})。


现在问题又来了:匹配后,如何按括号提取子串?


现在我们没办法用String.matches()这样简单的判断方法了,必须引入java.util.regex包,用Pattern对象匹配,匹配后获得一个Matcher对象,如果匹配成功,就可以直接从Matcher.group(index)返回子串:


import java.util.regex.*;


Run


运行上述代码,会得到两个匹配上的子串010和12345678。


要特别注意,Matcher.group(index)方法的参数用1表示第一个子串,2表示第二个子串。如果我们传入0会得到什么呢?答案是010-12345678,即整个正则匹配到的字符串。


Pattern


我们在前面的代码中用到的正则表达式代码是String.matches()方法,而我们在分组提取的代码中用的是java.util.regex包里面的Pattern类和Matcher类。实际上这两种代码本质上是一样的,因为String.matches()方法内部调用的就是Pattern和Matcher类的方法。


但是反复使用String.matches()对同一个正则表达式进行多次匹配效率较低,因为每次都会创建出一样的Pattern对象。完全可以先创建出一个Pattern对象,然后反复使用,就可以实现编译一次,多次匹配:


import java.util.regex.*;


Run

使用Matcher时,必须首先调用matches()判断是否匹配成功,匹配成功后,才能调用group()提取子串。


利用提取子串的功能,我们轻松获得了区号和号码两部分。


利用分组匹配,从字符串"23:01:59"提取时、分、秒。



正则表达式用(...)分组可以通过Matcher对象快速提取子串:

group(0)表示匹配的整个字符串;

group(1)表示第1个子串,group(2)表示第2个子串,以此类推。


相关文章
|
6月前
|
存储 Java 数据处理
|
6月前
|
数据采集 算法 Java
Java 正则表达式【匹配与分组基本原理】
Java 正则表达式【匹配与分组基本原理】
|
XML Java 数据格式
Java 实现汉字按照26个英文首字母分组排序(实际业务方法改造)
Java 实现汉字按照26个英文首字母分组排序(实际业务方法改造)
590 0
Java 实现汉字按照26个英文首字母分组排序(实际业务方法改造)
|
3月前
|
算法 Java
【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
ConcurrentHashMap通过分段锁(Segment)实现高效并发访问,get操作无需加锁,而put操作首先判断是否需要扩容,然后通过两次hash定位并尝试使用CAS和锁机制安全地添加元素。
|
5月前
|
Java BI Serverless
Java8 Stream深度解析:30个案例3万字助你精通集合筛选、归约、分组与聚合操作
Java8 Stream深度解析:30个案例3万字助你精通集合筛选、归约、分组与聚合操作
|
5月前
|
Java Spring 容器
详解java参数校验之:顺序校验、自定义校验、分组校验(@Validated @GroupSequence)
详解java参数校验之:顺序校验、自定义校验、分组校验(@Validated @GroupSequence)
|
6月前
|
Java Go 人工智能
Java每日一练(20230502) BST公共祖先、随机分组、K个一组翻转链表
Java每日一练(20230502) BST公共祖先、随机分组、K个一组翻转链表
46 0
Java每日一练(20230502) BST公共祖先、随机分组、K个一组翻转链表
|
6月前
|
Python Java Go
Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间
Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间
55 0
Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间
|
6月前
|
存储 前端开发 Java
Java【代码分享 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)
Java【代码分享 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)
49 0
|
6月前
|
Java API 数据库
Java8中的Stream的汇总和分组操作~它并不难的
Java8中的Stream的汇总和分组操作~它并不难的
289 0