识别正则表达式的方法
方法名 | 说明 |
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&&
//首字符任意,结束字符与首字符相同,首字符将捕获出来,再用一次
//首字符:(.)
//中间部分:.+
//结束字符:\\1
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("&abcz".matches(regex1));//false
System.out.println("-------------------");
//开始部分可以有多个字符,结束部分与其一致,将开始部分捕获出来,再用一次
//开始部分:(.+)
//中间部分:.+
//结束部分:\\1
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("&!@abc&!x".matches(regex2));//false
System.out.println("-------------------");
//开始部分可以有多个字符,每个字符也需要一致
//结束部分与开始部分一致,将开始部分捕获出来,再用一次
//开始部分:((.)\\2*)) (.)为第二组,需要重复,可以捕获出来用
//中间部分:.+
//结束部分:\\1
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("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);
}
}
}