正则表达式
1.概念
-
概述: 正则表达式其实就是一个匹配规则,用来替换之前复杂的if结构判断
-
在Java中,我们经常需要验证一些字符串,是否符合规则, 例如:校验qq号码是否正确,手机号码是否正确,邮箱是否正确等等。那么如果使用if就会很麻烦, 而正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则,我们可以验证用户输入的字符串是否匹配这个规则。
-
先看一个不使用正则表达式验证的例子:下面的程序让用户输入一个QQ号码,我们要验证:
- QQ号码必须是5–15位长度
- 而且必须全部是数字
- 而且首位不能为0
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.next();
System.out.println(checkQQ(qq));
}
//我们自己编写代码,验证QQ号码
private static boolean checkQQ(String qq) {
//1.验证5--15位
if(qq.length() < 5 || qq.length() > 15){
return false;
}
//2.必须都是数字;
for(int i = 0;i < qq.length() ; i++){
char c = qq.charAt(i);
if(c < '0' || c > '9'){
return false;
}
}
//3.首位不能是0;
char c = qq.charAt(0);
if(c == '0'){
return false;
}
return true;//验证通过
}
}
- 使用正则表达式验证:
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.next();
System.out.println(checkQQ2(qq));
}
//使用正则表达式验证
private static boolean checkQQ2(String qq){
String regex = "[1-9]\\d{4,14}";//正则表达式
return qq.matches(regex);
}
}
上面程序checkQQ2()方法中String类型的变量regex就存储了一个"正则表达式 ",而这个正则表达式就描述了我们需要的三个规则。matches()方法是String类的一个方法,用于接收一个正则表达式,并将"本对象"与参数"正则表达式"进行匹配,如果本对象符合正则表达式的规则,则返回true,否则返回false。
2. 正则表达式的基本使用
2.1字符类
语法示例:[] 表示匹配单个字符 ^ 取反 - 范围
- [abc]:代表a或者b,或者c字符中的一个。
- [^abc]:代表除a,b,c以外的任何字符。
- [a-z]:代表a-z的所有小写字符中的一个。 左右包含
- [A-Z]:代表A-Z的所有大写字符中的一个。
- [0-9]:代表0-9之间的某一个数字字符。
- [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
- [a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。
public class Test1 {
public static void main(String[] args) {
String str = "ead";
//1.验证str是否以h开头,以d结尾,中间是a,e,i,o,u中某个字符
System.out.println(str.matches("h[aeiou]d"));// false
System.out.println("hed".matches("h[aeiou]d"));// true
System.out.println("heod".matches("h[aeiou]d"));// false
System.out.println("==========================================");
//2.验证str是否以h开头,以d结尾,中间不是a,e,i,o,u中的某个字符
System.out.println(str.matches("h[^aeiou]d"));// false
System.out.println("hed".matches("h[^aeiou]d"));// false
System.out.println("hbd".matches("h[^aeiou]d"));// true
System.out.println("==========================================");
//3.验证str是否a-z的任何一个小写字符开头,后跟ad
System.out.println(str.matches("[a-z]ad"));// true
System.out.println("Aad".matches("[a-z]ad"));// false
System.out.println("==========================================");
//4.验证str是否以a-d或者m-p之间某个字符开头,后跟ad
System.out.println(str.matches("[a-dm-p]ad"));//false
System.out.println("bad".matches("[a-dm-p]ad"));// true
System.out.println("nad".matches("[a-dm-p]ad"));// true
}
}
2.2逻辑运算符
- &&:并且
- |: 或者
public class Test2 {
public static void main(String[] args) {
String str = "had";
//1.要求字符串是小写辅音字符开头,后跟ad 除了a,e,i,o,u之外,其他的都是辅音字母
System.out.println(str.matches("[a-z&&[^aeiou]]ad"));// true
System.out.println("aad".matches("[a-z&&[^aeiou]]ad"));// false
System.out.println("Aad".matches("[a-z&&[^aeiou]]ad"));// false
System.out.println("========================");
//2.要求字符串是aeiou中的某个字符开头,后跟ad
System.out.println(str.matches("[aeiou]ad"));// false
System.out.println(str.matches("[a|e|i|o|u]ad"));// false
System.out.println("aad".matches("[aeiou]ad"));// true
System.out.println("aad".matches("[a|e|i|o|u]ad"));// true
}
}
2.3
- “.” : 匹配任何字符。如果要表示一个字符点,那么就得使用\.
- "\d":任何数字[0-9]的简写;
- "\D":任何非数字[^0-9]的简写;
- "\s": 空白字符:[ \t\n\x0B\f\r] 的简写
- "\S": 非空白字符:[^\s] 的简写
- "\w":单词字符:[a-zA-Z_0-9]的简写
- "\W":非单词字符:[^\w]
public class Test3 {
public static void main(String[] args) {
String str = "258";
//1.验证str是否3位数字
System.out.println(str.matches("\\d\\d\\d"));// true
System.out.println("25".matches("\\d\\d\\d"));// false
System.out.println("+===================================");
//2.验证手机号:1开头,第二位:3/5/8,剩下9位都是0-9的数字
System.out.println(str.matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// false
System.out.println("13838381234".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// true
System.out.println("14838381234".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// false
System.out.println("+===================================");
//3.验证字符串是否以h开头,以d结尾,中间是任何字符
System.out.println(str.matches("h.d"));// false
System.out.println("h%d".matches("h.d"));// true
System.out.println("h#d".matches("h.d"));// true
System.out.println("+===================================");
//4.验证str是否是:h.d
System.out.println("h.d".matches("h.d"));// true
System.out.println("had".matches("h.d"));// true
System.out.println("h.d".matches("h\\.d"));// true
System.out.println("had".matches("h\\.d"));// false
}
}
2.4数量词
- X? : 0次或1次
- X*: 0次到多次
- X+ : 1次或多次
- X{n} : 恰好n次
- X{n,} : 至少n次
- X{n,m}: n到m次(n和m都是包含的)
public class Test4 {
public static void main(String[] args) {
//1.验证str是否是三位数字
System.out.println("123".matches("\\d{3}"));// true
System.out.println("12".matches("\\d{3}"));// false
System.out.println("1234".matches("\\d{3}"));// false
System.out.println("===================================");
//2.验证str是否是多位数字
System.out.println("12".matches("\\d{2,3}"));// true
System.out.println("123".matches("\\d{2,3}"));// true
System.out.println("1223".matches("\\d{2,3}"));// false
System.out.println("1".matches("\\d+"));// true
System.out.println("12".matches("\\d+"));// true
System.out.println("123".matches("\\d+"));// true
System.out.println("1234".matches("\\d+"));// true
System.out.println("===================================");
//3.验证str是否是手机号:1).第一位为1 2).第二位是3,5,8 3).后面9位都是数字
System.out.println("13838381234".matches("1[358]\\d{9}"));// true
System.out.println("14838381234".matches("1[358]\\d{9}"));// false
System.out.println("===================================");
//4.验证qq号码:1).5--15位;2).全部是数字;3).第一位不是0
System.out.println("123456".matches("[1-9]\\d{4,14}"));// true
System.out.println("023456".matches("[1-9]\\d{4,14}"));// false
System.out.println("123".matches("[1-9]\\d{4,14}"));// false
}
}
2.5分组括号( )
public class Test5 {
public static void main(String[] args) {
/*
正则表达式-分组括号( )
*/
String str = "DG8FV-B9TKY-FRT9J-99899-XPQ4G";
// 分成5组: 前面4组的规则是一样的 后面一组单独规则
System.out.println(str.matches("([A-Z0-9]{5}-){4}[A-Z0-9]{5}"));
// xxyy
// 扩展:正则表达式匹配叠词
// 哈哈,呵呵,嘿嘿,XX (.)表示第一组,\\1表示第一组
System.out.println("哈哈".matches("(.)\\1"));//true
System.out.println("呵呵".matches("(.)\\1"));//true
System.out.println("嘿嘿".matches("(.)\\1"));//true
System.out.println("嘿哈".matches("(.)\\1"));// false
// (.)表示第一组,\\1表示第一组,{3}表示\\1出现3次
System.out.println("哈哈哈哈".matches("(.)\\1{3}"));//true
System.out.println("呵呵呵呵".matches("(.)\\1{3}"));//true
System.out.println("嘿嘿嘿嘿".matches("(.)\\1{3}"));//true
System.out.println("===================================");
// 高高兴兴,逼逼赖赖,XXYY
// \\1表示第一组,\\2表示第二组,\\3表示第三组....
System.out.println("高高兴兴".matches("(.)\\1(.)\\2"));//true
System.out.println("逼逼赖赖".matches("(.)\\1(.)\\2"));//true
System.out.println("===================================");
// 快乐快乐,哔哩哔哩,XYXY
System.out.println("快乐快乐".matches("(..)\\1"));//true
System.out.println("哔哩哔哩".matches("(..)\\1"));//true
}
}
3.String中正则表达式的使用
1 String的split方法中使用正则表达式
-
String类的split()方法原型:
public String[] split(String regex)//参数regex就是一个正则表达式。可以将当前字符串中匹配regex正则表达式的符号作为"分隔符"来切割字符串。
-
代码示例:
public class Demo {
public static void main(String[] args) {
String str = "18 4 567 99 56";
String[] strArray = str.split(" +");
for (int i = 0; i < strArray.length; i++) {
System.out.println(strArray[i]);
}
}
}
2 String类的replaceAll方法中使用正则表达式
- String类的replaceAll()方法原型:
public String replaceAll(String regex,String newStr)//参数regex就是一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。
- 代码示例:
public class Demo {
public static void main(String[] args) {
//将下面字符串中的"数字"替换为"*"
String str = "jfdk432jfdk2jk24354j47jk5l31324";
System.out.println(str.replaceAll("\\d+", "*"));
}
}