正则表达式025.4正则表达式语法025.4.6捕获分组详见5.3.3
文章插图
例子
package li.regexp;import java.util.regex.Matcher;import java.util.regex.Pattern;//演示分组public class RegExp07 {public static void main(String[] args) {String content = "hanshunping s7789 nn1189han";//下面就是非命名分组//说明// matcher.group(0) 是不加括号匹配到的字符串// matcher.group(1) 是不加括号匹配到的字符串的第一个分组的内容// matcher.group(2) 是不加括号匹配到的字符串的第二个分组的内容//String regStr = "(\\d\\d)(\\d\\d)";//匹配4个数字的字符串//命名分组:即可以给分组取名(名称随意)String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配4个数字的字符串Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while (matcher.find()) {System.out.println("找到:" + matcher.group(0));System.out.println("第一个分组的内容:" + matcher.group(1));System.out.println("第一个分组的内容[通过组名]:" + matcher.group("g1"));System.out.println("第二个分组的内容:" + matcher.group(2));System.out.println("第二个分组的内容[通过组名]:" + matcher.group("g2"));}}}
文章插图
5.4.7非捕获分组
文章插图
例子给定一个字符串String content ="hello韩顺平教育 jack韩顺平老师 韩顺平同学hello";
使用非捕获分组完成,有如下要求:
- 找到韩顺平教育、韩顺平老师、韩顺平同学 子字符串
- 找到韩顺平 这个关键字 , 但是要求只是查找韩顺平教育和韩顺平老师中包含的韩顺平
- 找到韩顺平这个关键字,但是要求只是查找不是(韩顺平教育和韩顺平老师)中包含有的韩顺平
package li.regexp;import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegExp08 {public static void main(String[] args) {String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学hello";// 1. 找到 韩顺平教育、韩顺平老师、韩顺平同学 子字符串//String regStr = "韩顺平教育|韩顺平老师|韩顺平同学";//上面的写法可以等价于非捕获分组,注意:不能matcher.group(1)//String regStr = "韩顺平(?:教育|老师|同学)";// 2. 找到 韩顺平 这个关键字,但是要求只是查找 韩顺平教育 和 韩顺平老师 中包含的韩顺平//下面也是非捕获分组,也不能matcher.group(1)//String regStr = "韩顺平(?=教育|老师)";// 3. 找到 韩顺平 这个关键字,但是要求只是查找不是(韩顺平教育和韩顺平老师)中包含有的韩顺平//下面也是非捕获分组,也不能matcher.group(1)String regStr = "韩顺平(?!教育|老师)";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while (matcher.find()) {System.out.println("找到:" + matcher.group(0));}}}
5.4.8非贪婪匹配字符说明?当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的" 。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串 。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o" 。例子
package li.regexp;import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegExp09 {public static void main(String[] args) {String content = "hello111111 ok";//String regStr = "\\d+";//默认是贪婪匹配String regStr = "\\d+?";//非贪婪匹配Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while (matcher.find()) {System.out.println("找到:" + matcher.group(0));}}}
文章插图
5.5正则应用实例
- 对字符串进行如下验证
- 汉字
- 【day51-正则表达式02】邮政编码
要求:是1-9开头的一个六位数 , 比如:123890
- QQ号码:
要求:是一个1-9开头的一个(5位数-10位数) , 比如:12389,1345687,187698765
- 手机号码
要求:必须以13,14,15,18开头的11位数,比如:13588889999
- URL:https://www.bilibili.com/video/BV1fh411y7R8?p=893&spm_id_from=pageDriver&vd_source=7e137c3a1559f85aacb1f151bb0a830d
例子1:
package li.regexp;import java.util.regex.Matcher;import java.util.regex.Pattern;//正则表达式的应用实例public class RegExp10 {public static void main(String[] args) {String content = "1358888999";//1. 汉字//String regStr="^[\u4e00-\u9fa5]+$";//^和 $同时出现时,表示只能匹配 ^和 $之间的内容//2. 邮政编码//要求:是1-9开头的一个六位数,比如:123890//String regStr="^[1-9]\\d{5}$";//3. QQ号码://要求:是一个1-9开头的一个(5位数-10位数),比如:12389,1345687,187698765//String regStr = "^[1-9]\\d{4,9}$";//4. 手机号码//要求:必须以13,14,15,18开头的11位数,比如:13588889999String regStr = "^1[3458]\\d{9}$";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);if (matcher.find()) {System.out.println("满足格式");} else {System.out.println("不满足格式");}}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- day50-正则表达式01
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
- .net lambda表达式合并
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
- C++ 使用栈求解中缀、后缀表达式的值
- 【Java8新特性】- Lambda表达式
- 二 Python常用的正则表达式
- spring cron表达式源码分析
- 怎么算预产期
- 名不正言不顺是哪家的思想? 名不正言不顺是哪家的思想