JavaAPI——正则表达式

51 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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

image.png

测试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

image.png

测试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

image.png

测试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

image.png

测试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

image.png

测试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

image.png

测试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

image.png

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

例子范围说明
.任何字符
\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";