目录
1.正则表达式匹配对应规则
目录
字符串:
常用的规则表
字符类 | |
---|---|
[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]] | 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] |
Greedy 数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
匹配字符串实例演示:
1.验证qq号是否合法:不以0为开头,6-20位数字以内
String qq ="1a234567890";
//书写正则表达式
String regex = "[1-9]\\d{5,19}";
//正则表达式验证
System.out.println(qq.matches(regex));
其中[1-9]代表开头的第一位数字的取值范围,\d表示数字[0-9],{5,19}表示\d的位数。
细节:1.[1-9]表示了一位数字,所以后面的\d只能有5-19位
2.之所以要用到\\d,是因为\在Java中的意思是转义字符
如果写入正则表达式的是\d,那就是要给d进行转义,不符合我们的要求。
第一个\是为了给第二个\进行转义,在Java运行时用到的还是\d。
2.验证身份证号:
//写出身份证号的正则表达式
//440903 2007 11 14 0621
//1.前六位 (第一位不为0)(后面5位为任意数字) [1-9]\\d{5}
//2.年份,18,19,20 后面任意两位数字 (18|19|20)\\d{2}
//3.1-9,10,11,12 (0[1-9]|1[0-2])
//4.0-31 (0[1-9]|[12]\\d|3[0-1])
//5.任意数字出现三次,最后以为可为(数字,X,x) \\d{3}(\\d|(?i)x)
String regex="[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[0-
1])\\d{3}(\\d|(?i)x)";
System.out.println("44090320071114062x".matches(regex));
System.out.println("44090320071114062X".matches(regex));
System.out.println("440903200711140621".matches(regex));
4.0-31可以看成由0[1-9],1[0-9],2[0-9],3[0-1]
细节:1.当使用|符号时,注意自己的作用域,用括号()包起来,如果不使用,就会默认|的前面 全部是你的作用域的范围
2.(?i)的含义是忽略大小写
2.正则表达式在网络上爬取信息
public static void main(String[] args) throws IOException {
//1.创建一个URL的对象,即网址
URL url=new URL("https://www.yuanss.cc/book/59062.html");
//2.连接网络
URLConnection conn = url.openConnection();
//3.创建一个对象读取网络中的数据
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
//4.创建正则表达式
String regex = "\\d{1,3}";
//5.创建正则表达式对象
Pattern p = Pattern.compile(regex);
String line;//用于接受读取的一行数据
while ((line = br.readLine())!=null){
//6.创建文本适配器
Matcher m = p.matcher(line);
while (m.find()){
//7.获取截取的子串
System.out.println(m.group());
}
}
}
控制台截取到符合的信息
细节:网络一定要通畅