Java—— 正则表达式 方法及捕获分组
识别正则表达式的方法
方法名 | 说明 |
public String[] matches(String regex) | 判断字符串是否满足 正则表达式的规则 |
public string replaceAll(String regex,string newstr) | 按照正则表达式的 规则进行替换 |
public string[] split(String regex) | 按照正则表达式的 规则切割字符串 |
代码实现:
public class Test11 {public static void main(String[] args) {//第一个方法之前已经使用,主要演示后两个方法String str = "熊大mnduub熊二jnjdnjb光头强";String regex = "\\w+";String s = str.replaceAll(regex, "vs");System.out.println(s);//熊大vs熊二vs光头强String[] splitArr = str.split(regex);for (int i = 0; i < splitArr.length; i++) {System.out.println(splitArr[i]);}//熊大//熊二//光头强}
}
捕获分组:
一个括号代表一组,捕获分组就是把这一组的数据捕获出来,再用一次。
正则内部使用:\\组号
正则外部使用:$组号
组号定义规则:
从1开始,连续不间断
以左括号为基准,最左边的是第一组,其次为第二组,以此类推
案例演示:
需求1:正则内部使用
判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
举例:a123a b456b 17891 &abc&
判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
举例:abc123abc b456b 123789123 &!@abc&!@
需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分每个字符也需要一致
举例:aaa123aaa bbb456bbb 111789111 &&abc&&
代码实现:
public class Test12 {public static void main(String[] args) {//判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符//举例:a123a b456b 17891 &abc&//判断一个字符串的开始部分和结束部分是否一致,可以有多个字符//举例:abc123abc b456b 123789123 &!@abc&!@//需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分每个字符也需要一致//举例:aaa123aaa bbb456bbb 111789111 &&abc&&//首字符任意,结束字符与首字符相同,首字符将捕获出来,再用一次//首字符:(.)//中间部分:.+//结束字符:\\1String regex1 = "(.).+\\1";System.out.println("a123a".matches(regex1));//trueSystem.out.println("b456b".matches(regex1));//trueSystem.out.println("17891".matches(regex1));//trueSystem.out.println("&abc&".matches(regex1));//trueSystem.out.println("&abcz".matches(regex1));//falseSystem.out.println("-------------------");//开始部分可以有多个字符,结束部分与其一致,将开始部分捕获出来,再用一次//开始部分:(.+)//中间部分:.+//结束部分:\\1String regex2 = "(.+).+\\1";System.out.println("abc123abc".matches(regex2));//trueSystem.out.println("b456b".matches(regex2));//trueSystem.out.println("123789123".matches(regex2));//trueSystem.out.println("&!@abc&!@".matches(regex2));//trueSystem.out.println("&!@abc&!x".matches(regex2));//falseSystem.out.println("-------------------");//开始部分可以有多个字符,每个字符也需要一致//结束部分与开始部分一致,将开始部分捕获出来,再用一次//开始部分:((.)\\2*)) (.)为第二组,需要重复,可以捕获出来用//中间部分:.+//结束部分:\\1String regex3 = "((.)\\2*).+\\1";System.out.println("aaa123aaa".matches(regex3));//trueSystem.out.println("bbb456bbb".matches(regex3));//trueSystem.out.println("111789111".matches(regex3));//trueSystem.out.println("&&abc&&".matches(regex3));//trueSystem.out.println("aaa123aaz".matches(regex3));//false}
}
需求2:正则外部使用
将字符串:我要学学编编编编程程程程程程
替换为:我要学编程
代码实现:
public class Test13 {public static void main(String[] args) {//将字符串:我要学学编编编编程程程程程程//替换为:我要学编程String str = "我要学学编编编编程程程程程程";//(.) 表示把重复内容的第一个字符看做一组//\\1 表示第一字符再次出现//+ 表示至少一次//$1 表示把正则表达式中第一组的内容,再拿出来用String s = str.replaceAll("(.)\\1+", "$1");System.out.println(s);//我要学编程}
}
非捕获分组:
分组之后不需要再用本组数据,仅仅是把数据括起来。
符号 | 含义 | 举例 |
(?:正则) | 获取所有 | Java(?:8|11|17) |
(?=正则) | 获取前面部分 | Java(?=8|11|17) |
(?!正则) | 获取不是指定内容的前面部分 | Java(?!8|11|17) |
代码演示:
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test9 {public static void main(String[] args) {String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//需求1//其中 ?是占位符代表字符串Java,=表示字符串Java后面连接的部分//但是在获取的时候,只获取=前半部分String regex1 = "Java(?=8|11|17)";//调用方法进行爬虫show(regex1,str);//Java//Java//Java//Java//需求2//方式1:常规方式String regex2 = "Java(8|11|17)";show(regex2,str);//Java8//Java11//Java17//Java17//方式2:?是占位符代表字符串Java,:表示字符串Java后面连接的部分//在获取的时候,可以全部获取String reges3 = "Java(?:8|11|17)";show(reges3,str);//Java8//Java11//Java17//Java17//需求3//?是占位符代表字符串Java,!表示字符串Java后面连接的部分///在获取的时候,获取的是除了与!后面连接匹配的子串String regex4 = "Java(?!8|11|17)";show(regex4,str);//Java}//抽取一个方法进行爬虫public static void show(String regex,String str){Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);while(m.find()){String s = m.group();System.out.println(s);}}
}