正则表达式是一个字符串,使用单个字符来描述、用来定义匹配规则,匹配一系列符合某个语法规则的字符串。在开发中,正则表达式通常被用来检索替换那些符合某些规则的文本。
是一种字符串的匹配模式,用来检查是否包括某种子串、将匹配的字符串提取替换等操作。
构造正则表达式,用多种元字符与运算符可以将小的表达式结合起来创建更大的表达式。
(1) 通配符
用 ? 和 * 通配符来查找硬盘上的文件。 ?通配符匹配文件名中的单个字符,而 * 通配符匹配零个或多个字符。
像 data?.dat 这样的模式将查找下列文件:
data1.dat 、 data2.dat ;
使用 * 字符代替 ?字符扩大了找到的文件的数量。data*.dat匹配下列所有文件:
data.dat 、data12.dat 、dataXYZ .dat
(2) 优点
使用正则表达式,可以
1、测试字符串内的模式;
2、替换文本;
3、基于模式匹配从字符串中提取子字符串
package com.lei.Arrayslei;
import java.util.Arrays;
public class day04_正则表达式 {
public static void main(String[] args) {
String s = "aa_bb_cc_dd";
//内部使用了正则表达式来切割
String arr[] = s.split("_");
System.out.println(Arrays.toString(arr)); //[aa, bb, cc, dd]
//判断字符串开头是数字,并以abc结尾的字符串
String s1 = "111abc";
//^ 匹配字符串起始位置
//[0-9] 字符串的内容可以是0-9
//+ 匹配一个或多个字符
//abc 匹配abc字母 $ 字符串的结束位置
String regex = "^[0-9]+abc$";
//查看s1是否匹配该正则
boolean b = s1.matches(regex);
System.out.println(b);
//替换
String s2 = "aaasdada";
System.out.println(s2.replace("a", "3")); //333sd3d3
}
}
(3) 基本语法
(1)选择:“|”,具有最低优先级
package com.lei.Arrayslei;
import java.util.Arrays;
public class day04_正则表达式 {
public static void main(String[] args) {
//判断字符串开头是数字,并以abc结尾的字符串
String s1 = "111abc";
//结尾是abc或uuu
String regex2 = "^[0-9]+(abc|uuu)$";
System.out.println(s1.matches(regex2)); //true
System.out.println("111abcuuu".matches(regex2)); //false
}
}
(2)数量限定:
+:前面的字符必须至少出现一次;
?:前面的字符最多只可以出现一次;
* :前面的字符可以不出现,也可以出现一次或多次
(3)匹配()
用来定义操作符的范围和优先度
(4) 匹配长度为6位到12位的数字
package com.lei.Arrayslei;
import java.util.Arrays;
public class day04_正则表达式 {
public static void main(String[] args) {
//匹配长度为6位到12位的数字
String regex3 = "[0-9]{6,12}";
System.out.println("匹配长度为6位到12位的数字: "+"123555".matches(regex3));
}
}
(5) 匹配手机号
package com.lei.Arrayslei;
import java.util.Arrays;
public class day04_正则表达式 {
public static void main(String[] args) {
//匹配手机号
String tel = "1[3758][0-9]{9}";
System.out.println("匹配手机号"+"13678905678".matches(tel));
}
}
(6) 判断字符串开头和结尾
”a*b“ :在多个a或零个a后面有个b,b必须为最后一个字符。
(7) 字符串类中涉及正则表达式的常用方法
matches() : 判断是否匹配
split() : 根据给定正则表达式的匹配拆分字符串
replaceAll() : 使用给定的replacement替换此字符串索引匹配给定的正则表达式的子字符串。
(8) 练习
匹配规则
正整数:" \ \d+"
正小数:" \ \d+\ \ . \ \ d+"
负整数:" -\ \d+"
负小数:" -\ \d+\ \ . \ \ d+"
保留两位小数的正数:" \ \d+\ \ . \ \ d{2}"
保留1-3位小数的正数:" \ \d+\ \ . \ \ d{1,3}"
匹配合法的邮箱
"^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\ \ .)+[a-z]{2,}$"
"\ \ w+@\ \ w+(\ \ . \ \ w+)+"
(在使用中,以上所有的空格都删除,这里方便记录加上空格)
//匹配邮箱
String regex4 = "^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$";
//或者"[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+"
System.out.println("[email protected]".matches(regex4)); //true
String regex5 = "\\w+@\\w+(\\.\\w+)+";
System.out.println("[email protected]".matches(regex5)); //true
(9) Pattern和Matcher类
Pattern类的作用在于编译正则表达式后创建一个匹配模式
Matcher类使用Pattern实例提供的模式信息对正则表达式空虚匹配
package com.lei.Arrayslei;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class day04_正则表达式 {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("a*b");
Matcher matcher = pattern.matcher("aaaaab");
boolean matches = matcher.matches();
System.out.println(matches); //true
boolean matches1 = pattern.matches("a*b", "aaaabbbb");
System.out.println(matches1);
}
}