J a v a 正则表达式 \huge{Java \space 正则表达式} Java 正则表达式
概述
正则表达式是什么?
简单来讲就是使用一些已经提前规定好的字符指定字符串匹配的规则。
先直观感受一下正则表达式的魅力,给定一个业务场景:
解决:
public class RegexDemo1 {
public static void main(String[] args) {
// 需求:校验qq号码,必须全部数字 6 - 20位
System.out.println(checkQQ("251425998"));
System.out.println(checkQQ("2514259a98"));
System.out.println(checkQQ(null));
System.out.println(checkQQ("2344"));
System.out.println("-------------------------");
// 正则表达式的初体验:
System.out.println(checkQQ2("251425998"));
System.out.println(checkQQ2("2514259a98"));
System.out.println(checkQQ2(null));
System.out.println(checkQQ2("2344"));
}
//使用正则表达式进行判断
//\\d两个\是因为第一个要进行转义
//\\d{6,20}意思就是检查字符串最短6位,最多20位,是否全部都是数字
public static boolean checkQQ2(String qq){
return qq != null && qq.matches("\\d{6,20}");
}
//非正则表达式的判断
//首先判断长度是否合格
//然后逐个看每位是否合格
public static boolean checkQQ(String qq){
// 1、判断qq号码的长度是否满足要求
if(qq == null || qq.length() < 6 || qq.length() > 20 ) {
return false;
}
// 2、判断qq中是否全部是数字,不是返回false
// 251425a87
for (int i = 0; i < qq.length(); i++) {
// 获取每位字符
char ch = qq.charAt(i);
// 判断这个字符是否不是数字,不是数字直接返回false
if(ch < '0' || ch > '9') {
return false;
}
}
return true; // 肯定合法了!
}
}
\\d{6,20}
与后面的一大坨,一看就知道正则表达式比较好用啦!
正题
①.使用
先不说正则表达式怎么写,给出来正则表达式应该怎么用呢?
S
t
r
i
n
g
String
String类中的
m
a
t
c
h
e
s
(
)
matches()
matches()方法就可以传入正则表达式进行判断。
例:
qq.matches("\\d{6,20}");
就是使用后面的正则表达式来判断qq
这个字符串是否符合规则。
所以写好了正则表达式,直接在对应的字符串上调用
m
a
t
c
h
e
s
(
)
matches()
matches()方法就好啦!
②.规则
一个一个做演示,示例:
public class RegexDemo02 {
public static void main(String[] args) {
//public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true
// 只能是 a b c
System.out.println("a".matches("[abc]")); // true
System.out.println("z".matches("[abc]")); // false
// 不能出现a b c
System.out.println("aa".matches("[^abc]")); // false
System.out.println("z".matches("[^abc]")); // true
// \\d:匹配一个数字,[0~9]
// \\D:不是一个数字,[^0~9]
System.out.println("a".matches("\\d")); // false
System.out.println("3".matches("\\d")); // true
System.out.println("333".matches("\\d")); // false
// \\w:匹配英文、数字、下划线
// \\W:不是一个英文、数字或者下划线
System.out.println("z".matches("\\w")); // true
System.out.println("2".matches("\\w")); // true
System.out.println("21".matches("\\w")); // false
System.out.println("你".matches("\\w")); //false
System.out.println("你".matches("\\W")); // true
// 以上正则匹配只能校验单个字符。
System.out.println("---------------------------------");
// 以下校验多个字符
// 校验密码
// 必须是数字 字母 下划线 至少 6位
System.out.println("2442fsfsf".matches("\\w{6,}"));
System.out.println("244f".matches("\\w{6,}"));
// 验证码 必须是数字和字符 必须是4位
//第一种写法:直接写全都是数字和字符
System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));
System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));
//第二种写法:使用\\w但是减去下划线
System.out.println("23dF".matches("[\\w&&[^_]]{4}"));
System.out.println("23_F".matches("[\\w&&[^_]]{4}"));
}
}
//❗正则表达式中千万不要乱写空格,匹配的时候有可能错误的去使用空格识别
❗ ❗ ❗ [ a − z & & [ ( ˆ m − p ) ] ] [a-z \&\&[\^(m-p)]] [a−z&&[(ˆm−p)]]的意思就是, [ a − z ] [a-z] [a−z]但是出去里面 [ m − p ] [m-p] [m−p]的结果(按照集合角度理解)
所以正则表达式可以写成以下格式:
[]{};
[]:代表的是一个字符出现所符合的条件
{}:代表这个字符出现的次数,可以是一个范围({2,4}最少出现两次,最多四次),也可以是一个准确的数({5}出现五次)
样例解析
- 手机号码匹配
String regex = "1[3-9]\\d{9}";
"1":电话号码开头单独出现的“1”
"[3~9]":出现一个在[3~9]范围内的字符
"\\d{9}":\\d代表出现的字符都是数字,{9}符合前面这个要求的数字要出现9次
- 邮箱号码匹配
String regex = "\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}";
"\\w{1,30}":此部分为注册邮箱的账号,字符可以是数字、字母、下划线,并且至少出现一个,最多出现30个
"@":无需解释
"[a-zA-Z0-9]{2,20}":一个字符在[a-zA-Z0-9]这个范围内,并且这样的字符最多出现20个,最少2个
"\\.":匹配一个“.”
"(xxx){1,2}":符合前面所有条件的字符串,最少出现一次,最多出现两次(域名判断)
- 电话号码匹配
String regex = "0\\d{2,6}-?\\d{5,20}";
"0":单独匹配一个“0”
"\\d{2,6}":一个字符属于数字,并且这样的字符最多出现六个,最少出现两个
"-?":此处为格式“X?”,意为至多出现一次(一次或者不出现),等价为“-{1}”
"\\d{5,20}":同上,不过这样的字符最多出现20个,最少出现6个
- 多组条件同时匹配
多组条件同时匹配的时候用|
将不同的匹配条件分割开。
//同时匹配上面的电话号码、手机号码、邮箱
String regex = "(0\\d{2,6}-?\\d{5,20})|(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|(1[3-9]\\d{9})"
③. 实际应用场景
正则表达式在方法中使用
正则表达式本质就是一个字符串,正则表达式可以当作每个特殊方法的参数,作为该方法运行的规则。
public String[] split(String regex)
按照正则表达式的匹配内容进行分割字符串,去除所有符合条件的字符,将剩下所有符合条件的部分转换为一个字符串数组进行返回。
例:
String names = "阿杰asdjsik周凯asdjadk陈sjka";
String[] arr = names.split("\\w+");
"\\w+":字符属于数字、字母、下划线,出现次数至少出现一次(将所有的乱字母都匹配消除了)
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]);
}
运行结果:
public String replaceAll(String regex,String newStr)
按照正则表达式制定的规则,对符合条件的部分用newStr
进行替换。
例:
String names = "阿杰asdjsik周凯asdjadk陈sjka";
String names2 = names.replaceAll("\\w+", " ");
//将中间乱序英文用" "进行替换
System.out.println(names2);
运行结果:
正则表达式爬取信息(过程背就行)
基本流程为将网站上的信息以字符串的形式接收下来,然后如下流程:
- 定义爬取规则(写
regex
) - 将爬取规则编译为匹配对象(使用
Pattern
类)
Pattern pattern = Pattern.compile(regex);
- 得到一个匹配器对象
Pattern pattern = Pattern.compile(regex);
- 循环查找
while (matcher.find()) { //matcher使用按照爬取规则设定好的匹配对象在rs中进行寻找
String rs1 = matcher.group(); //将符合条件的一组取出来(matcher.group())
System.out.println(rs1);
}
例:
String rs = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
"itcast@itcast.cn,电话18762832633,0203232323" +
"邮箱bozai@itcast.cn,400-100-3233 ,4001003232";
// 需求:从上面的内容中爬取出 电话号码和邮箱。
// 1、定义爬取规则,字符串形式
String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|(1[3-9]\\d{9})" +
"|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";
// 2、把这个爬取规则编译成匹配对象。
Pattern pattern = Pattern.compile(regex);
// 3、得到一个内容匹配器对象
Matcher matcher = pattern.matcher(rs);
// 4、开始找了
while (matcher.find()) { //matcher使用按照爬取规则设定好的匹配对象在rs中进行寻找
String rs1 = matcher.group(); //将符合条件的一组取出来(matcher.group())
System.out.println(rs1);
}
运行结果: