Java基础篇(五)———正则表达式(常用于爬虫)
定义:
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
首先我们先了解正则表达式的方法:
public boolean matches(String regex):若正则匹配返回true,反之false
字符类(默认匹配一个字符)
| [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-z&&[^bc]] ([ad-z]减法) |
a到z(不包含b和c) |
预定义的字符类(默认匹配一个字符)
|
. |
任何字符 |
| \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 {n} | 正好n次 |
| X {n, } | 至少n次 |
| X {n,m} | 至少n但不超过m次 |
这里先举一个简单地例子:
1 public class RegexDemo1 { 2 public static void main(String[] args) { 3 // 需求:校验qq号码,必须全部数字 6 - 20位 4 System.out.println(checkQQ("251425998")); 5 System.out.println(checkQQ("2514259a98")); 6 System.out.println(checkQQ(null)); 7 System.out.println(checkQQ("2344")); 8 9 System.out.println("-------------------------"); 10 // 正则表达式的初体验: 11 System.out.println(checkQQ2("251425998")); 12 System.out.println(checkQQ2("2514259a98")); 13 System.out.println(checkQQ2(null)); 14 System.out.println(checkQQ2("2344")); 15 16 } 17 18 public static boolean checkQQ2(String qq){ 19 return qq != null && qq.matches("\\d{6,20}"); 20 } 21 22 23 public static boolean checkQQ(String qq){ 24 // 1、判断qq号码的长度是否满足要求 25 if(qq == null || qq.length() < 6 || qq.length() > 20 ) { 26 return false; 27 } 28 29 // 2、判断qq中是否全部是数字,不是返回false 30 // 251425a87 31 for (int i = 0; i < qq.length(); i++) { 32 // 获取每位字符 33 char ch = qq.charAt(i); 34 // 判断这个字符是否不是数字,不是数字直接返回false 35 if(ch < '0' || ch > '9') { 36 return false; 37 } 38 } 39 40 return true; // 肯定合法了! 41 } 42 }
\\d{6,20}对于这个正则表达式,首先两个\第一个是为了转义转义字符,让他没有转义的意思,可以看做就是\d,然后{6.20}就是贪婪的量词,QQ号一般都是在这个范围内的
那么如果我们需要从一堆字符串中找到有用的信息怎么办呢?
比如:“刘备dhdfhdf342关羽43fdffdfbjdfaf张飞”
要求:将字符串中的字母消除
这里我们首先想到的准备操作是利用String的split方法将有用的信息分割到数组中去,或者是用replaceAll方法将字母替换为“ ”。
核心代码如下
String[] arrs = names.split("\\w+");
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]);
}
String names2 = names.replaceAll("\\w+", " ");
System.out.println(names2);
我这里只是抛砖引玉,大家完全可以想到更好地方法或者练习更难的题目来提升自己对正则表达式的利用。
最后在这里留下一个思考题
电话020-43422424,或者联系邮箱" +
"itcast@itcast.cn,电话18762832633,0203232323" +
"邮箱bozai@itcast.cn,400-100-3233 ,4001003232"
要求:提取出上述字符串中有用信息(号码,邮箱),如果对自己要求高可以将他们分类表示出来。

浙公网安备 33010602011771号