正则表示
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
正则表达式初体验
- 需求:假如现在要求校验一个qq号码是否正确,6位及20位之内,必须全部是数字
- 先使用目前所学知识完成校验需求;然后体验一下正则表达式检验。
传统方法
public boolean checkQQ(String qq){
if(qq == null || qq.length() < 6 || qq.length() > 13 ){
return false;
}
for (int i= 0; i < qq.length(); i++) {
char ch = qq.charAt(i);
if(ch < "0" || ch > "9") {
return false;
}
}
return true;
}
正则方法
public boolean checkQQ(String qq){
return qq != null && qq.matches("\\d(6,13)");
}
规则
字符类(默认匹配一个字符)
| 正则表达式 |
说明 |
| [abc] |
只能是a,b,或c |
| [^abc] |
除了a,b.c之外的任何字符 |
| [a-zA-Z] |
a到zA到Z,包括(范围) |
| [a-d[m-p]] |
a则d,或m通过p:([a-dm-p]联合) |
| [a-z&&[def]] |
d,e,或f(交集) |
| [a-z8&[^bc]] |
a到z,除了b和c:([ad-z]减法) |
| [a-z&&[^m-p]] |
a到z,除了m到p:([a-lq-z]减法) |
预定义字符类(默认匹配一个字符)
| 正则表达式 |
说明 |
| . |
任何字符 |
| \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 boolean checkPhone(String phone){
return phone.matches("1[3-9]\\d{9}");
}
邮箱格式
public boolean checkEmail(String email){
return email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}");
}
座机
public boolean checkTel(String tel){
return tel.matches("0\\d{2,6}-?\\d{5,20}");
}
正则表达式在字符串中的使用
| 方法名 |
说明 |
| public String replaceAll(String regex,String newStr) |
按照正则表达式匹配的内容进行替换 |
| public String[] split(String regex) |
按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。 |
爬取信息
public static void main(String[] args) {
String rs = "电话023-43422424,或者联系邮箱suibian@qq.com,还有电话18762832633,8203232323"
String regex = "(\\w{1,30}@[a-ZA-Z0-9]{2,20}(\\.[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}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(rs);
while(matcher.find()) {
String rs1= matcher.group();
System.out.println(rs1);
}
}