正则表达式

正则表达式其实是由一些特殊的符号组成的,它代表的是某种规则。

正则表达式的作用:

  1. 用来校验字符串数据是否合法
  2. 可以从一段文本中查找满足要求的内容

正则表达式的好处

我们就以QQ号码为例

不使用正则表达式,校验QQ号码代码是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static boolean checkQQ(String qq){
// 1、判断qq号码是否为null
if(qq == null || qq.startsWith("0") || qq.length() < 6 || qq.length() > 20){
return false;
}

// 2、qq至少是不是null,不是以0开头的,满足6-20之间的长度。
// 判断qq号码中是否都是数字。
// qq = 2514ghd234
for (int i = 0; i < qq.length(); i++) {
// 根据索引提取当前位置处的字符。
char ch = qq.charAt(i);
// 判断ch记住的字符,如果不是数字,qq号码不合法。
if(ch < '0' || ch > '9'){
return false;
}
}
// 3、说明qq号码肯定是合法
return true;
}

用正则表达式代码是这样的

1
2
3
public static boolean checkQQ1(String qq){
return qq != null && qq.matches("[1-9]\\d{5,19}");
}

我们发现,使用正则表达式,大大简化的了代码的写法。

正则表达式的书写格式

字符类(只匹配单个字符)

1
2
3
4
5
6
7
[abc]: 只能是a,b,或c
[^abc]: 除了a,b,c之外的任何字符
[a-zA-z]: a到z,A到z, 包括(范围)
[a-d[m-p]]: a到d,或m到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])

注意:以上带[内容] 的规则都只能用于匹配单个字符

示例:System.out.println("ab".matches("[a-zA-z]")) //输出false

预定义字符(只匹配单个字符)

1
2
3
4
5
6
7
. : 任何字符
\d : 一个数字:[0-9]
\D : 非数字:[^0-9]
\s : 一个空白字符:
\S : 非空白字符:[^\s]
\w : [a-zA-z_0-9]
\W : [^\w]一个非单词字符

\d{9} //代表判断是否有9个[0-9]的数字

数量词

1
2
3
4
5
6
X? : X,一次或0次
X* : X,零次或多次
X+ : X,一次或多次
X {n} : X,正好n次
X {n, } : X,至少n次
× {n, m} : X,至少n但不超过m次

链接

封面图来源:https://www.pixiv.net/artworks/75941927