1 正则表达式的基本语法
元字符的功能:限定符;选择匹配符;分组组合和反向引用符;特殊字符;字符匹配符;定位符
1.1 转义符
说明:转义符(\\)用于在正则表达式中检索某些特殊字符。例如:匹配 . * + ( ) $ / \ ? [ ] ^ { } 等在正则表达式中有具体含义的字符。
public class Test01 {
public static void main(String[] args) {
String content = "abc$(a.bc(123( )";
//转义了. 使其单纯匹配.本身,没有其他含义
String regStr = "\\.";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}
}
}
1.2 字符匹配符
说明:匹配指定的字符
image-20210604083139495.png image-20210604083151568.png
1.3 选择匹配符
说明:在匹配某个字符串的时候具有选择性的
image-20210604083408567.png1.4 限定符
说明:用于指定其前面的字符和组合项连续出现多少次
image-20210604083747388.png image-20210604083800078.png1.5 定位符
说明:规定要匹配的字符串出现的位置
image-20210604084206567.png1.6 分组
image-20210604084528221.png image-20210604084541063.png1.7 分组、捕获和反向引用
分组:可以用圆括号组成一个比较复杂的匹配模式,一个圆括号的部分可以看作是一个子表达式/一个分组。
捕获:把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则式。
反向引用:圆括号内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个称为反向引用,这种引用既可以在正则表达式内部,也可以是在正则表达式外部,内部反向引用\\分组号,外部反向引用 $分组号。
//匹配两个连续的相同数字:(\\d)\\1
//匹配五个连续的相同数字:(\\d)\\1{4}
//匹配个位和千位相同,十位和百位相同的数 5225,1551:(\\d)(\\d)\\2\\1
//把类似 : "我我要学学学学编程 java!",通过正则表达式修改成 "我要学编程java"
public class Test01 {
public static void main(String[] args) {
String content = "我我要学学学学编程 java!";
String newContent = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
System.out.println(newContent);
}
}
2 正则表达式的常用类
2.1 Pattern类
Pattern对象是正则表达式对象。Pattern类没有公共构造方法,要创建一个Pattern对象,需要调用其公共静态方法,它返回一个Pattern对象。该方法接受一个正则表达式作为第一个参数。
Pattern pattern = Pattern.compile(regStr);
//matches() 方法,用于整体匹配, 在验证输入的字符串是否满足条件使用
public class Test01 {
public static void main(String[] args) {
String content = "abc$(a.bc(123( )";
//该正则可以匹配全部content的字符串,故为true
String regStr = "^abc.*";
boolean matches = Pattern.matches(regStr, content);
System.out.println(matches);
}
}
2.2 Matcher类
Matcher对象是对输入字符串进行解析和匹配的引擎。与Pattern类一样,Matcher也没有公共构造方法,需要调用Pattern对象的matcher方法来获得一个Matcher对象
public class Test01 {
public static void main(String[] args) {
String content = "abc$(a.bc(123( )";
String regStr = "bc";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
//1.start和end方法获取匹配字符串在源字符串的开始和结尾的索引
System.out.println("start: " + matcher.start() + ",end: " + matcher.end());
System.out.println(content.substring(matcher.start(), matcher.end()));
}
//2.替换匹配的字符串为指定的字符串
String newContent = matcher.replaceAll("hello");
System.out.println(newContent);
regStr = "^abc.*";
pattern = Pattern.compile(regStr);
matcher = pattern.matcher(content);
//3.整体匹配方法,常用于校验某个字符串是否满足某个规则
boolean matches = matcher.matches();
System.out.println(matches);
}
}
3 String类中使用正则表达式
public class Test01 {
public static void main(String[] args) {
String content = "Hello1.3,aaaaa&Hello1.4";
//1.替换功能
String newContent = content.replaceAll("Hello1.3|Hello1.4", "nihao");
System.out.println(newContent);
//2.判断功能
boolean matches = content.matches("^Hello.*$");
System.out.println(matches);
//3.分割功能
String[] split = content.split(",|&");
for (String s : split) {
System.out.println(s);
}
}
}
网友评论