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

news2024/11/28 10:31:47

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

简单举例:

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

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

代码演示:
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])
代码演示:
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以上的字符串使用正则表达式的字符类判断,那么需要对应长度数量的中括号,第一个字符会根据第一个中括号中的条件判断,后面的字符则会根据后面的中括号判断。

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

预定义字符:

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

代码演示:
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次        

代码演示:

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

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位

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

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

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

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

编写代码:
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

编写代码:
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("输入的身份证号码不满足要求,请重新输入:");
            }
        }
    }
}
运行结果:

总结:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS移植到标准库

源码下载 1:从官网获取freeRTOS源码 freeRTOS官网 2:FreeRtos源码文件阐述 3:移植FreeRtos源码 FreeRTOS移植步骤1:添加FreeRTOS源码,将FreeRTOS源码添加到基础工程,头文件等路径2:添加FreeR…

VRRP+MSTP+BFD

一、组网 二、要求 PC6(vlan 10内PC)访问1.1.1.1走JR-1——CORE1——MSR到1.1.1.1 PC7(vlan 20内PC)访问1.1.1.1走JR-2——CORE2——MSR到1.1.1.1 链路故障时切换路线,来回路径一致 三、配置步骤 SR bfd echo-sou…

Spring AI 来了,打造Java生态大模型应用开发新框架!

Spring AI 来了,打造Java生态大模型应用开发新框架! Spring AI 开发框架设计理念Spring AI 主要功能特性如下 Spring AI 应用开发案例案例一:基于大模型的对话应用开发案例二:RAG 检索增强应用开发案例三:Function Cal…

基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的高校招生系统1拥有两种角色:管理员和用户 管理员:学生管理、专业管理、报名管理、录取通知管理、招生公告管理等 用户:登录注册、报…

智慧园区革新之路:山海鲸可视化技术引领新变革

随着科技的飞速发展,智慧园区已成为城市现代化建设的重要组成部分。山海鲸可视化智慧园区解决方案,作为业界领先的数字化革新方案,正以其独特的技术优势和丰富的应用场景,引领着智慧园区建设的新潮流。 本文将带大家一起了解一下…

【linux】基础IO(三)

上一节基础IO我们着重理解了重定向与缓冲区,这节我们需要重点理解文件再磁盘中是怎样存储。以及上一节我们没有涉及到的知识。 stderr到时有什么用? 目录 fd-> 0 1 2:初步理解2怎样将错误与正确输出都打印在一个文件? 文件在硬…

【Vue】我的第一个组件

文章目录 项目简介 项目简介 项目根目录中的index.html是项目的入口文件 加载index.html,vite解析。指向的src下的ts文件或者js文件 最后通过vue3的createApp函数创建一个应用,并挂载到指定div下 App.vue结构说明 特别注意:script脚本内&#xff0…

23.oracle保留两位小数、小数点后不足两位的补0

to_char()函数:转化数字型指定小数点位数的用法/* to_char(0.1,fm9999990.00) */

缓存穿透问题

缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的两种解决方案: 1.缓存空对象 优点:实现简单,维护方便 缺点:占用…

Spring Cloud微服务入门(三)

服务注册与发现的概念 服务之间相互访问: 例如:用户中心与内容中心之间相互调用。 问题: 服务调用需要知道对方的服务地址,地址写在哪里? 如果服务是多个实例部署,该调用哪一个? 如果服务是多…

父组件明明使用了v-model,子组件竟然可以不用定义props和emit抛出事件,快来看看吧

前言 vue3.4增加了defineModel宏函数,在子组件内修改了defineModel的返回值,父组件上v-model绑定的变量就会被更新。大家都知道v-model是:modelValue和update:modelValue的语法糖,但是你知道为什么我们在子组件内没有写任何关于props的定义和…

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后,尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个,dll.dll是上面提到…

[LeetCode][LCR178]训练计划 VI——使用位运算寻找数组中不同的数字

题目 LCR 178. 训练计划 VI 教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1: 输入:actions [5, …

帝国CMS模板源码整站安装说明(图文)

安装步骤 第一步:先把得到的文件解压缩,把文件通过FTP传到空间里。(请不要把类似www.lengleng.net这个文件夹传到FTP,请传这个大文件夹下面的所有文件夹和文件到空间根目录,请不要上传到2级目录,除非你自己…

kimi开放API使用了,来看如何使用

更多精彩内容在公众号。 kimi现在算是国内火得不行的AI工具。最近使用人太多,都经常出现响应不过来的情况。借助这波热潮,kimi顺势推出了API使用。 来看kimi的官方介绍使用。https://platform.moonshot.cn 文本生成模型 Moonshot的文本生成模型&#…

外包干了6天,技术明显进步

先说一下自己的情况,本科生,2019年我通过校招踏入了南京一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…

PWM 脉宽跟随方案介绍

1. 前言 数字电源产品在使用桥式电路拓扑或是多路交错控制中,有时会需要滞后臂的 PWM 脉宽严格跟随超前臂的 PWM 脉宽,或从路的 PWM 脉宽严格跟随主路的 PWM 脉宽,本文将介绍如何利用高精度定时器实现 PWM 输出脉宽跟随,一种使用…

设计模式浅析(十一) ·状态模式

设计模式浅析(十一) 状态模式 日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 状态模式 概念 状态模式 Java中的状态模式(State Pattern)是一种行为型…

Web漏洞-文件上传常见验证

后缀名:类型,文件头等 后缀名:黑白名单 文件类型:MIME信息 文件头:内容头信息 常见黑名单(明确不允许上传的格式后缀):asp、php、jsp、aspx、cgi、war (如果没有完整…

绿联 安装Frpc内网穿透并使用Nginx反向代理

绿联 安装Frpc内网穿透并使用Nginx反向代理 1、前言 服务器官网:雨云 - 新一代云服务提供商 本教程使用Frps与Frpc进行内网穿透,其中Frps需要自购服务器安装,若无法购买服务器则本教程对你无用; 另外还需拥有自己的域名&#xf…