正则表达式
作用
- 可用一些规定的字符来制定规则,并用来检验数据格式的合法性
正则表达式初体验
**问题:**校验一个qq号码是否正确,6位及20位之内,必须全部是数字 。
**解题思路:**现有知识解决,在使用正则表达式体验
public class RegexDemo01 {
public static void main(String[] args) {
/*
校验一个qq号码是否正确,6位及20位之内,必须全部是数字 。
*/
System.out.println(checkQQ("123144"));
System.out.println(checkQQ("sjfj2323"));
System.out.println(checkQQ("fjs2"));
// 正则表达式
System.out.println(checkQQByRegex("jfsie32223"));
System.out.println(checkQQByRegex("232343"));
}
public static boolean checkQQByRegex(String qq){
// String类中提供了matches()方法,对正则表达式进行匹配 \d:表示数字 在Java中单斜杠要加转义字符 \,表示单斜杠
return qq != null && qq.matches("\\d{6,20}");
}
public static boolean checkQQ(String qq){
// qq为null,长度小于6,长度大于20,都为false
if (qq == null || qq.length() < 6 || qq.length() > 20) {
return false;
}
// 判断qq是否全为数字,不是返回false
for (int i = 0; i < qq.length(); i++) {
// 获取每位字符
char ch = qq.charAt(i);
// 出现不是数字的就返回false
if (ch < '0' || ch > '9') {
return false;
}
}
// 全为数字,返回true
return true;
}
}
匹配方法
字符串对象提供的匹配正则表达式的方法
方法 | 方法描述 |
---|
public boolean matches(String regex) | 判断是否匹配正则表达式,匹配返回true,不匹配返回 |
正则表达式书写
字符类(默认匹配一个字符)
表达式 | 描述 |
---|
[abc] | 只能是a, b, 或c |
[^abc] | 除了a, b, c之外的任何字符 |
[a-zA-Z] | a到z A到Z,包括(范围) |
[a-d[m-p]] | a到d,或m到p:([a-dm-p]联合),并集 |
[a-z&&[def]] | d, e, 或f(交集) |
[a-lq-z] | a到z,除了m到p |
[ad-z] | a到z,除了b和c:[a-b&& [^bc]] |
预定义类(默认匹配一个字符)
表达式 | 描述 |
---|
. | (点)任何字符 |
\d | 一个数字,[0-9] |
\D | 非数字: [^0-9] |
\s | 一个空白字符: [ \t\n\x0B\f\r] |
\S | 非空白字符: [^\s] |
\w | [a-zA-Z_0-9] 英文、数字、下划线 |
\W | [^\w] 一个非单词字符 |
贪婪的量词(配合匹配多个字符)
表达式 | 描述 |
---|
X? | X,一次或根本没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X {n} | X,正好n次 |
X{n,} | X,至少n次 |
X{n,m} | X,至少n次 但不超过m次 |
代码示例
public class RegexDemo02 {
public static void main(String[] args) {
// 字符类 只能是 a b c
System.out.println("a".matches("[abc]"));
System.out.println("z".matches("[abc]"));
// 字符类 不能是 a b c
System.out.println("a".matches("[^abc]"));
System.out.println("bz".matches("[^abc]"));
// 预定义类
System.out.println("a".matches("\\d"));//一个数字
System.out.println("1".matches("\\D"));// 一个非数字
// 贪婪的量词
System.out.println("123".matches("\\d{3}"));// 三个数字
System.out.println("ac".matches("\\s{2}"));// 两个空白字符
// 校验密码 必须是数字、字母、下划线 至少6次
System.out.println("fj32_".matches("\\w{6,}"));
// 验证码 必须是数字和字符,必须4位
System.out.println("je33".matches("[\\w&&[^_]]{4}"));
}
}
案列-验证邮箱
public class RegexDemo03 {
public static void main(String[] args) {
// 对邮箱格式进行判断 1335353@qq.com 111112443@.com.cn
System.out.println(checkEmail("1543@qqd.com.cn"));
System.out.println(checkEmail("111112443@khg.com.cn"));
}
public static boolean checkEmail(String email){
/*
1到30位的数字、字母、下划线
一位@字符
2到20位的数字、字母、
(一位. 2到20位数字、字母、)1到2次
*/
if (email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")) {
return true;
}else {
return false;
}
}
}
正则表达式在方法中的应用
方法名 | 说明 |
---|
public String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
public String[] split(String regex): | 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。 |
代码实现
public class RegexDemo04 {
public static void main(String[] args) {
// 正则表达式分割
String names = "小明232sfhsh大明232sj李雷";
String[] name = names.split("\\w+");
for (int i = 0; i < name.length; i++) {
System.out.println(name[i]);
}
// 正则表达式 替换
String namesNew = names.replaceAll("\\w+", ",");
System.out.println(namesNew);
}
}
正则表达式爬取信息
public class RegexDemo05 {
public static void main(String[] args) {
String string = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
"itcast@itcast.cn,电话18762832633,0203232323" +
"邮箱bozai@itcast.cn,400-100-3233 ,4001003232";
/*
需求:从上面的内容中爬取出 电话号码和邮箱。
*/
/*
1.定义爬取规则
邮箱: \w{1,30}@[a-zA-Z0-9]{2,20}(\.[a-zA-Z0-9]{2,20}){1,2}
电话号码:
[1][3-9]\d{9} 第一位以1开头 第二位3-9 剩下9位0到9
0[2-6]0-?\d{5,20}
400-?\d{3,9}-?\d{3,9}
*/
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(string);
// 4.开始找匹配的内容
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}
}
}