一、正则表达式的体验
正则表达式
概念:其实就是一个匹配的原则,用来替换之前复杂的if判断结构
在Java中,我们经常需要验证一些字符串,是否符合既定规则
PS:
我们要验证QQ号或者手机号,以及邮箱是否正确,我们就需要使用if来判断
这个时候我们为了优化代码,就需要使用正则表达式,来验证各种字符串的规则,它内部定义了一些规则,来验证我们的字符串是否符合规则
需求:
使用程序让用户输入QQ号码,要求QQ号码
1.必须是5-15位的长度
2.必须全部都是数字
3.首位不能是0
public static void main (String[] args) {
System.out.println(checkQQ_1("123456789"));
System.out.println(checkQQ_2("123456789"));
}
// 使用正则表达式验证QQ
public static boolean checkQQ_2(String qq){
return qq.matches("[1-9]\\d{4,14}");
}
// 验证QQ号码格式是否正确
public static boolean checkQQ_1(String qq){
// 第一,不能为空
if(qq == null){
return false;
}
// 第二,长度必须为5-15位
if(qq.length() < 5 || qq.length() > 15){
return false;
}
// 第三,必须全部是数字
for(int i = 0; i < qq.length(); i++){
// 获取qq中的每一个字符
char c = qq.charAt(i);
// 判断字符是否非数字
if(c < '0' || c > '9'){
return false;
}
}
// 第四,首位不能位0
if(qq.charAt(0) == '0'){
return false;
}
return true;
}
输出结果:
true
true
二、正则表达式的基本使用
(一)、字符类
语法实例:[]表示匹配单个字符 ^取反 -范围
1.[abc]:代表a或者b,或者c字符的一个
2.[^abc]:代表abc以外的任意字符
3.[a-z]:代表a到z的所有小写字符中的任意一个,左右包含
4.[A-Z]:代表A到Z的所有大写字符中的任意一个,左右包含
5.[0-9]:代表0-9的所有数字中的任意一个,左右包含
6.[a-zA-Z0-9]:代表a到z,A到Z,0到9之间的任意一个字符,
7.[a-dm-p]:代表a到d,m到p之间的任意一个字符
String str = "ead";
// 验证str是否以h开头,以d结尾,中间是否是a,e,i,o,u中的某个字符
System.out.println(str.matches("h[aeiou]d"));
System.out.println("hbd".matches("h[aeiou]d"));
System.out.println("head".matches("h[aeiou]d"));
System.out.println("hhd".matches("h[aeiou]d"));
// 验证str是否是 a-z 的任何一个小写字符开头,后面跟的是ab
System.out.println("accb".matches("[a-z][^c-z]"));
// 验证str是否以 a-d 或者 m-p之间某个字符开头,后面跟的是ab
System.out.println("e".matches("[a-dm-p]"));
输出结果:
false
true
false
false
false
false
(二)、逻辑运算符类
语法:
1. && 且
2. | 或者
tring str = "abc";
// 要求字符串是小写字符开头,后面跟ad,除了aeiou之外,其他都是小写字母
System.out.println(str.matches("[a-z&&[^aeiou]]ad"));
// 要求字符串是aeiou中的某个字符开头,后面跟ad
System.out.println(str.matches("[a|e|i|o|u]ad"));
输出结果:
false
false
(三)、预定义字符
语法:
- "." 匹配任何字符,如果你要使用 . 的话,需要加上转义 \.
- "\d" 匹配任何数字[0-9]
- ”\D" 匹配非数字[^0-9]
- "\s" 空白字符[\n\t\r\f\x0B]
- "\S" 非空白字符[^\n\t\r\f\x0B]
- "\w" 单词字符[a-zA-Z]_0-9]
- "\W" 非单词字符[a-zA-Z]_0-9]
public static void main (String[] args) {
String str = "258";
// 验证str是否是三位数字
System.out.println(str.matches("\\d\\d\\d"));
// 验证手机号码: 1开头,3/5/8是第二位,剩下的九位是0-9的数字
System.out.println("123456789".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));
System.out.println("1324567890".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));
System.out.println("13245678".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));
// 验证字符串是否以 h开头,以d结尾,中间是任何字符
System.out.println("h.d".matches("h.d"));
System.out.println("h d".matches("h.d"));
System.out.println("h& d".matches("h.d"));
// 验证只能匹配 h.d
System.out.println("h.d".matches("h\\.d"));
}
输出结果:
true
false
false
false
true
true
false
true
(四)、分组括号
分组括号()
\\1表示的意思是按照之前的再来一个
String str = "EDSW-ES9F-KHJG-87JHG-OHV7";
// 分为5组,前面4组规则一样,后面一组单独规则
System.out.println(str.matches("([A-Z0-9]{4}-){4}[A-Z0-9]{4}"));
// 哈哈,嘿嘿,哼哼,呵呵的词的正则
System.out.println("哈哈".matches("(.)\\1"));
System.out.println("嘿哈".matches("(.)\\1"));
// 哈哈嘿嘿
System.out.println("哈哈嘿嘿".matches("(.)\\1(.)\\2"));
输出结果:
false
true
false
true
(五)、数量词
语法:
X? 0次或1次
X* 0次或多次
X+ 1次或多次
X{n} 恰好n次
X{n,} 至少n次
X{n,m} n次到m次,n和m包含
// 验证str是否是三位数字
System.out.println("".matches("\\d{3}"));
System.out.println("123".matches("\\d{3}"));
System.out.println("1234".matches("\\d{3}"));
// 验证str是否至少1位
System.out.println("".matches("\\d{2,}"));
System.out.println("1".matches("\\d+"));
System.out.println("12".matches("\\d+"));
// 验证手机号码:1开头,3/5/8是第二位,剩下九位是0-9的数字
System.out.println("".matches("1[358]\\d{9}"));
// qq号码,1 必须是5-15位, 2、都是数字 3、首位不是0
System.out.println("12345123451234".matches("[0-9]\\d{4,14}"));
输出结果:
false
true
false
false
true
true
false
true