开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
先看个例子
如果我们要判断一个QQ号是否满足格式,规则如下
- 6~20位数字
- 0不能作为开头
- 必须全为数字,不能是字母 遇到这种处理字符串的题目,我们首先想到的是模拟
- 先过滤一下不满足6~20位的
- 再过滤一下不满足0开头的
- 最后过滤一下不全为数字的
- 剩下的就是满足条件的了
字符串模拟代码如下
public static boolean checkQQ(String str) {
int length = str.length();
//先判断位数
if (length < 6 || length > 20) return false;
//再判断是否是零开头
if (str.startsWith("0")) return false;
//必须全部是数字
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c < '0' || c > '9') return false;
}
return true;
}
我们会发现,判断是否的麻烦繁琐,那么有没有更简单的方法呢?
答案是有的!就是正则表达式
//正则表达式来处理字符串
QQ.matches("[1-9]\\d{5,19}");
可以看到,模拟的一大部分一下子就变得简略了~
正则表达式的作用
- 校验字符串是否满足规则
- 在一段文本中查找满足要求的内容
正则表达式规则
字符类(只匹配一个字符)
例子 | 范围说明 |
---|---|
[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]] | a到z与def的交集.为:d,e,f |
[a-z&&[^bc]] | a到z和非bc的交集.为:[ad-z] |
[a-z&&[^m-p]] | a到z和除了m到p的交集.为:[a-[q-z]] |
举例子
测试1:
//只能是a b c
System.out.println("-------------------1-------------------");
System.out.println("a".matches("[abc]"));//true
System.out.println("z".matches("[abc]"));//false
//只能匹配一个字符
System.out.println("ab".matches("[abc]"));//false
System.out.println("ab".matches("[abc][abc]"));//true
测试2:
//不能是a b c
System.out.println("-------------------2-------------------");
System.out.println("z".matches("[^abc]"));//true
System.out.println("a".matches("[^abc]"));//false
//只能匹配一个字符
System.out.println("zz".matches("[^abc]"));//false
System.out.println("zz".matches("[^abc][^abc]"));//true
测试3:
//a到z A到Z(包括头尾)
System.out.println("-------------------3-------------------");
System.out.println("a".matches("[a-zA-Z]"));//true
System.out.println("-".matches("[a-zA-Z]"));//false
//只能匹配一个字符
System.out.println("zz".matches("[a-zA-Z]"));//false
System.out.println("zz".matches("[a-zA-Z][a-zA-Z]"));//true
测试4:
// [a-d[m-p]] a到d,或m到p
System.out.println("-------------------4-------------------");
System.out.println("a".matches("[a-d[m-p]]"));//true
System.out.println("d".matches("[a-d[m-p]]"));//true
System.out.println("e".matches("[a-d[m-p]]"));//false
System.out.println("m".matches("[a-d[m-p]]"));//true
System.out.println("p".matches("[a-d[m-p]]"));//true
System.out.println("z".matches("[a-d[m-p]]"));//false
测试5:
// [a-z&&[def]] a-z和def的交集 即为def
System.out.println("-------------------5-------------------");
//如果要求两个范围内的交集,那么需要写符号&&
//如果写成了一个&,那么此时&表示就不是交集了,而是一个简简单单的&符号
System.out.println("a".matches("[a-z&&[def]]"));//false
System.out.println("b".matches("[a-z&&[def]]"));//false
System.out.println("e".matches("[a-z&&[def]]"));//true
System.out.println("f".matches("[a-z&&[def]]"));//true
System.out.println("z".matches("[a-z&&[def]]"));//false
System.out.println("0".matches("[a-z&&[def]]"));//false
测试6:
//[a-z&&[^bc]] a-z和非bc的交集 等同于[ad-z]
System.out.println("-------------------6-------------------");
System.out.println("a".matches("[a-z&&[^bc]]"));//true
System.out.println("b".matches("[a-z&&[^bc]]"));//false
System.out.println("d".matches("[a-z&&[^bc]]"));//true
System.out.println("x".matches("[a-z&&[^bc]]"));//true
System.out.println("z".matches("[a-z&&[^bc]]"));//true
测试7:
//[a-z&&[^m-p]] a到z和除了m到p的交集 等同于[a-lq-z]
System.out.println("-------------------7-------------------");
System.out.println("a".matches("[a-z&&[^m-p]]"));//true
System.out.println("e".matches("[a-z&&[^m-p]]"));//true
System.out.println("l".matches("[a-z&&[^m-p]]"));//true
System.out.println("m".matches("[a-z&&[^m-p]]"));//false
System.out.println("q".matches("[a-z&&[^m-p]]"));//true
System.out.println("z".matches("[a-z&&[^m-p]]"));//true
System.out.println("0".matches("[a-z&&[^m-p]]"));//false
预定义字符(只匹配一个字符)
例子 | 范围说明 |
---|---|
. | 任何字符 |
\d | 数字:[^0-9] |
\D | 一个空白字符:[\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次 |
忽略大小写的书写方式
String regex="(?i)abc";