Java常用API_正则表达式_检验字符串是否满足规则——基础使用方法及综合练习

正则表达式可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。

简单举例:

校验一个qq号是否符合要求

要求:6位到20位之内,不能以0开头,必须全是数字

代码演示:
java 复制代码
public class Test1 {
    public static void main(String[] args) {
        //符合要求的字符串
        String qq1 = "1112222333";

        //不符合要求的字符串
        //开头为0
        String qq2 = "0112222333";
        //不是全数字
        String qq3 = "1112222a33";
        //位数非6~20位
        String qq4 = "12345";

        //输出结果
        System.out.println(qq1.matches("[1~9]\\d{5,19}"));
        System.out.println(qq2.matches("[1~9]\\d{5,19}"));
        System.out.println(qq3.matches("[1~9]\\d{5,19}"));
        System.out.println(qq4.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-lq-z])
代码演示:
java 复制代码
public class Test2 {
    public static void main(String[] args) {

        //只能是a,b或c
        System.out.println("----------1----------");
        System.out.println("a".matches("[abc]"));//true
        System.out.println("z".matches("[abc]"));//false
        System.out.println("7".matches("[abc]"));//false

        //除了a,b,c之外的任何字符
        System.out.println("----------2----------");
        System.out.println("a".matches("[^abc]"));//f
        System.out.println("z".matches("[^abc]"));//t
        System.out.println("7".matches("[^abc]"));//t

        //a到z或A到Z
        System.out.println("----------3----------");
        System.out.println("a".matches("[a-zA-Z]"));//t
        System.out.println("A".matches("[a-zA-Z]"));//t
        System.out.println("7".matches("[a-zA-Z]"));//f

        //a到d,或m到p
        System.out.println("----------4----------");
        System.out.println("a".matches("[a-d[m-p]]"));//t
        System.out.println("m".matches("[a-d[m-p]]"));//t
        System.out.println("f".matches("[a-d[m-p]]"));//f

        //a到z和def的交集(即d,e,f)
        System.out.println("----------5----------");
        System.out.println("a".matches("[a-z&&[def]]"));//f
        System.out.println("d".matches("[a-z&&[def]]"));//t
        System.out.println("7".matches("[a-z&&[def]]"));//f

        //a到z和非bc的交集(等同于[ad-z])
        System.out.println("----------6----------");
        System.out.println("a".matches("[a-z&&[^bc]]"));//t
        System.out.println("b".matches("[a-z&&[^bc]]"));//f
        System.out.println("7".matches("[a-z&&[^bc]]"));//f

        //a到z和除了m到p的交集(等同于[a-lq-z])
        System.out.println("----------7----------");
        System.out.println("a".matches("[a-z&&[^m-p]]"));//t
        System.out.println("m".matches("[a-z&&[^m-p]]"));//f
        System.out.println("0".matches("[a-z&&[^m-p]]"));//f

    }
}
运行结果:
注意:

正则表达式的字符类一个中括号只能判断字符串中的一个字符,若对长度为2以上的字符串使用正则表达式的字符类判断,那么需要对应长度数量的中括号,第一个字符会根据第一个中括号中的条件判断,后面的字符则会根据后面的中括号判断。

代码演示:
java 复制代码
public class Test3 {
    public static void main(String[] args) {
        System.out.println("ab".matches("[abc][abc]"));//true
        System.out.println("ab".matches("[abc]"));//false
    }
}
运行结果:

预定义字符:

预定义字符和字符类的作用差不多,单独使用只匹配一个字符,并且两者可以通过不同形式表达相同限制范围。

代码演示:
java 复制代码
public class Test4 {
    public static void main(String[] args) {
        //预定义字符  单个字符

        //  .    任何字符
        System.out.println("------1------");
        System.out.println("a".matches("."));//true
        System.out.println("a你".matches("."));//false
        System.out.println("a你".matches(".."));//true


        //  \d  一个数字:[0-9]
        System.out.println("------2------");
        System.out.println("a".matches("\\d"));//f
        System.out.println("1".matches("\\d"));//t
        System.out.println("11".matches("\\d"));//f


        //  \D  非数字:[^0-9]
        System.out.println("------3------");
        System.out.println("a".matches("\\D"));//t
        System.out.println("1".matches("\\D"));//f
        System.out.println("aa".matches("\\D"));//f


        //  \s  一个空白字符:[\t\n\x0B\f\r]
        System.out.println("------4------");
        System.out.println("\t".matches("\\s"));//t
        System.out.println("a".matches("\\s"));//f
        System.out.println("\t\t".matches("\\s"));//f


        //  \S  非空白字符:[^\s]  与上一个空白字符为补集
        System.out.println("------5------");
        System.out.println("\t".matches("\\S"));//f
        System.out.println("a".matches("\\S"));//t
        System.out.println("aa".matches("\\S"));//f


        //  \w  [a-zA-Z_0-9]英文、数字、下划线
        System.out.println("------6------");
        System.out.println("a".matches("\\w"));//t
        System.out.println("A".matches("\\w"));//t
        System.out.println("1".matches("\\w"));//t
        System.out.println("只".matches("\\w"));//f
        System.out.println("因".matches("\\w"));//f
        System.out.println("aa".matches("\\w"));//f


        //  \W(大写W)  [^\w] 一个非单词字符  与上一个单词字符为补集
        System.out.println("------7------");
        System.out.println("a".matches("\\W"));//f
        System.out.println("A".matches("\\W"));//f
        System.out.println("1".matches("\\W"));//f
        System.out.println("只".matches("\\W"));//t
        System.out.println("因".matches("\\W"));//t
        System.out.println("aa".matches("\\W"));//f

    }
}
运行结果:

数量词(与字符类或预定义字符搭配使用):

通过字符类或预定义字符与数量词搭配使用,可以达到一个字符类或预定义字符判断多个字符。

常用数量词有:

复制代码
X为字符类或预定义字符
X?     一次或零次
X*     零次或多次
X+     一次或多次
X{n}   正好n次
X{n,}  至少n次
X{n,m} 至少n但不超过m次        
代码演示:

这里我都使用的预定义字符 . 表示任意字符都可以

java 复制代码
public class Test5 {
    public static void main(String[] args) {
        //使用数量词  可以判断多个字符
        //X为字符类或预定义字符
        //X?     一次或零次
        System.out.println("------1------");
        System.out.println("".matches(".?"));//t
        System.out.println("a".matches(".?"));//t
        System.out.println("aa".matches(".?"));//f

        //X*     零次或多次
        System.out.println("------2------");
        System.out.println("".matches(".*"));//t
        System.out.println("a".matches(".*"));//t
        System.out.println("aa".matches(".*"));//t

        //X+     一次或多次
        System.out.println("------3------");
        System.out.println("".matches(".+"));//f
        System.out.println("a".matches(".+"));//t
        System.out.println("aa".matches(".+"));//t

        //X{n}   正好n次
        System.out.println("------4------");
        System.out.println("".matches(".{2}"));//f
        System.out.println("a".matches(".{2}"));//f
        System.out.println("aa".matches(".{2}"));//t

        //X{n,}  至少n次
        System.out.println("------5------");
        System.out.println("".matches(".{2,}"));//f
        System.out.println("a".matches(".{2,}"));//f
        System.out.println("aa".matches(".{2,}"));//t
        System.out.println("aaa".matches(".{2,}"));//t

        //X{n,m} 至少n但不超过m次
        System.out.println("------6------");
        System.out.println("".matches(".{1,3}"));//f
        System.out.println("a".matches(".{1,3}"));//t
        System.out.println("aa".matches(".{1,3}"));//t
        System.out.println("aaa".matches(".{1,3}"));//t
        System.out.println("aaaa".matches(".{1,3}"));//f

        //混合使用
        System.out.println("----混合举例----");
        //要求十个单词字符
        System.out.println("234abcABC_".matches("\\w{10}"));//t
        //要求数字或字母但不能是abc,且位数为5-10位
        System.out.println("123abcABC".matches("[0-9a-zA-Z&&[^abc]]{5,10}"));//f
        System.out.println("123abcABC123123".matches("[0-9a-zA-Z&&[^abc]]{5,10}"));//f
        System.out.println("123defABC".matches("[0-9a-zA-Z&&[^abc]]{5,10}"));//t

    }
}
运行结果:

基本练习1:

题目:使用正则表达式验证用户输入的手机号码、座机号码、邮箱号是否满足要求。

手机号码要求:第一位为1,第二位为3到9的数字,每一位都为数字,总位数要为11位

举例:13011112222

座机号码要求:第一部分:区号 要求:以0开头,每一位都为数字,3位或4位

第二部分: - 要求:可以出现也可以不出现,即0次或1次

第三部分:号码 要求:不能以0开头,由5到10位数字组成

举例:0234-123456 02222222

邮箱号要求: 第一部分:@左边 要求:字母数字或下划线都可,无位数限制,但至少有一位

第二部分:@ 要求:必须出现,且只能出现一次

第三部分:@右边 要求:

也分为三部分:1.分隔符号点: **.**的左边:字母或者数字,2到6位

  1. 分隔符号点:. : 必须有且只有一个 .

3.分隔符号点: **.**的右边 :字母2到3位

4.2和3可出现1到2次,即可以后缀.com.cn

举例:abc123@111.com 123@test.com.cn

编写代码:
java 复制代码
public class Test6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //手机号码验证
        System.out.println("请输入手机号码:");
        while (true) {
            String phone = sc.next();
            if(phone.matches("1[3-9]\\d{9}")) {
                System.out.println("输入的手机号满足要求");
                break;
            } else {
                System.out.println("输入的手机号不满足要求,请重新输入:");
            }
        }

        //座机号码验证
        System.out.println("请输入座机号码:");
        while (true) {
            String landline = sc.next();
            if(landline.matches("0\\d{2,3}\\-?[1-9]{4,9}")) {
                System.out.println("输入的座机号码满足要求");
                break;
            } else {
                System.out.println("输入的座机号码不满足要求,请重新输入:");
            }
        }

        //邮箱号验证
        System.out.println("请输入邮箱号:");
        while (true) {
            String email = sc.next();
            if(email.matches("\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}")) {
                System.out.println("输入的邮箱号满足要求");
                break;
            } else {
                System.out.println("输入的邮箱号不满足要求,请重新输入:");
            }
        }

    }
}
运行结果:

基本练习2:

题目:校验身份证号码

举例:11122220000101361x

分析要求:前面6位:第一位不为0,其余五位都为数字

再四位为年份:年份前两位为18、19、20,后两位任意两位数字

两位月份:01 ~ 12

两位日期:01 ~31

最后四位:前三位可以为任意数字,最后一位可以为数字可以为大写X或小写x

编写代码:
java 复制代码
public class Test7 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入身份证号码:");
        while (true) {
            String personId = sc.next();
            if (personId.matches("[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|10|11|12)((0[1-9])|([12]\\d)|(3[01]))\\d{3}[\\dXx]")) {
                System.out.println("输入的身份证号码满足要求");
                break;
            } else {
                System.out.println("输入的身份证号码不满足要求,请重新输入:");
            }
        }
    }
}
运行结果:

总结:

相关推荐
电饭叔31 分钟前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
Eternal-Student32 分钟前
everyday_question dq20240731
开发语言·arm开发·php
极客先躯36 分钟前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
卑微求AC1 小时前
(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题
c语言·开发语言
夜月行者1 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
Yvemil71 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
潘多编程1 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_2 小时前
SpringMVC
java·spring
代码在改了2 小时前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot