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

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

简单举例:

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

总结:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CicadaPlayer】视频切换/音视频同时切换

G:\CDN\all_players\CicadaPlayer-github-0.44\mediaPlayer\SuperMediaPlayer.hCicadaPlayer https://github.com/alibaba/CicadaPlayer可以clone 整个仓库的历史 git clone --bare https://github.com/username/project.git整体架构 :根据这个更容易理解:切换就是judgeFunc…

ElasticSearch的相关概念

文章目录 1、整体介绍1.1、elasticsearch的作用1.2、ELK技术栈1.3、elasticsearch和lucene1.4、为什么不是其他搜索技术?1.5、总结 2、倒排索引2.1、正向索引2.2、倒排索引2.3、总结 3、ES的一些概念3.1、文档和字段3.2、索引和映射3.3、mysql与elasticsearch3.4、安…

Mac安装配置Appium

一、安装 nodejs 与 npm 安装方式与 windows 类似 ,官网下载对应的 mac 版本的安装包,双击即可安装,无须配置环境变量。官方下载地址:https://nodejs.org/en/download/ 二、安装 appium Appium 分为两个版本,一个是…

4.7总结(内部类,JDBC API || 离散化,树状数组)

JAVA学习小结 一.内部类 基础概念,用途和访问特点 什么是内部类:写在一个类中的另一个类称之为内部类; 内部类的用途:用于封装那些单独存在时没有意义,且是外部类的一部分的类(汽车发动机,人…

flutter升级3.10.6Xcode构建报错

flutter sdk 升级Xcode报错收集,错误信息如下: Error (Xcode): Cycle inside Runner; building could produce unreliable results.没问题版本信息: Xcode:15.3 flutter sdk :3.7.12 dart sdk:2.19.6 …

【AI】ubuntu 22.04 本地搭建Qwen-VL 支持图片识别的大语言模型 AI视觉

下载源代码 yeqiangyeqiang-MS-7B23:~/Downloads/src$ git clone https://gh-proxy.com/https://github.com/QwenLM/Qwen-VL 正克隆到 Qwen-VL... remote: Enumerating objects: 584, done. remote: Counting objects: 100% (305/305), done. remote: Compressing objects: 10…

深度学习pytorch——RNN从表示到原理、应用、发展、实战详细讲解(终结)

时间序列的表示 题外话:在自然界中,我们接触到的信号都是模拟信号,在手机、电脑等电子设备中存储的信号是数字信号。我们通常对模拟信号进行等间隔取样得到数字信号,这个数字信号也被称为序列。将模拟信号转换为数据信号的过程称为…

C# wpf 嵌入外部程序

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 嵌入外部程序(本章) 第五章 底部嵌入HwndHost 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现?1、定义属性2、进程嵌入(1&…

Windows11配置VUE开发环境

目录 一、按照nodejs二、命令安装npm cache clean --forcenpm install -g vue/clinpm install npm -gnpm install webpacknpm install vue-cli -g与npm install -g vue/cli区别npm install -g cnpm --registryhttps://registry.npm.taobao.orgnpm i yarn -g --verbosenpm i -g …

全面解析十七种数据分析方法,具象数据分析思维

一、介绍 在当今数据驱动的商业环境中,数据分析已经成为了企业获取竞争优势的关键工具。无论是为了优化运营效率,提高客户满意度,还是推动产品创新,企业都需要通过分析大量数据来做出明智的决策。数据分析方法多种多样&#xff0c…

计算机网络-文件传输及IP协议——沐雨先生

实验内容 编写请求文件的客户Java应用程序编写响应文件请求的服务器Java应用程序利用Wireshark查看和分析IP包 基本要求 使用Java语言建立请求文件的客户应用程序使用Java语言建立响应文件请求的服务器应用程序了解IP协议的工作过程了解IP包首部各字段及含义 对Java应用程序…

机器学习——模型融合:平均法

机器学习——模型融合:平均法 在机器学习领域,模型融合是一种通过结合多个基本模型的预测结果来提高整体模型性能的技术。模型融合技术通常能够降低预测的方差,提高模型的鲁棒性,并在一定程度上提高预测的准确性。本文将重点介绍…

数据结构初阶:栈和队列

栈 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。…

腾讯云4核8G服务器12M带宽646元1年零3个月,4C8G使用场景说明

腾讯云4核8G服务器多少钱?腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月,活动页面 txybk.com/go/txy 活动链接打开如下图所示: 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器,详细配置为:轻量4核…

hive图形化客户端工具

hive准备 创建测试数据 以root用户登录,使用hive命令启动hive。 创建库 create database testhivedb; 创建表 create table testhivedb.testhivetable( id int ,name string ); 插入数据 insert into testhivedb.testhivetable values (1,cc); insert into…

《债务与国家的崛起》西方民主制度的金融起源 - 三余书屋 3ysw.net

债务与国家的崛起:西方民主制度的金融起源 你好,今天我们来聊聊由英国知名经济与金融历史学家詹姆斯麦克唐纳所著的《债务与国家的崛起》这本书。19世纪世界历史上发生了一次巨变,即“大分流”。当时西方通过工业革命实现了科技和经济的飞速…

为什么苹果 Mac 电脑需要使用清理软件?

尽管 Apple Mac 电脑因其卓越的性能、简洁高效的 macOS 操作系统及独特的美学设计备受全球用户青睐,但任何电子设备在长期使用后都难以避免面临系统资源日渐累积的问题。其中一个重要维护需求在于,随着使用时间的增长,Mac电脑可能会由于系统垃…

xilinx 7系列fpga上电配置

一、前言 Xilinx FPGA通过加载比特流到内部存储单元来进行配置。 Xilinx FPGA存在两种数据配置路径,一种是满足最小引脚需求的串行路径,一种是可用8位、16位或32位来连接到行业的高性能通用接口,如处理器,8位或者16位并行的闪存…

测试开发:从0到1学习如何测试API网关

日常工作中,难免会遇到临危受命的情况,虽然没有这么夸张,但是也可能会接到一个陌生的任务,也许只是对这个概念有所耳闻。也许这个时候会感到一丝的焦虑,生怕没法完成领导交给的测试任务。其实也没有必要那么紧张&#…

【微服务】面试题(一)

最近进行了一些面试,这几个问题分享给大家 一、分别介绍一下微服务、分布式以及两者的区别 微服务(Microservices)和分布式系统(Distributed Systems)是两种不同的软件架构风格,虽然它们之间有些重叠&#…