Java对正则表达式的支持(手机、身份证校验)

2023-11-15

1【数量:单个】字符匹配

.:表示任意字符,即由任意字符组成;

\\: 匹配\; (重要

\n:匹配换行;

\t:匹配制表符;

2【数量:单个】字符集(可以从里面任选一个字符)。

[abc]:表示可能是字母 a、b、c中的任意一个;

[^abc]:表示不是由字母 a、b、C中的任意一个;

[a-zA-Z]:表示由一个任意字母所组成,不区分大小写。同理加上 ^表示取反;

[0-9]:表示由一位数字所组成。同理加上 ^表示取反

3【数量:单个】简化字符集;

.:表示任意的一个字符;

\d:等价于[0-9]范围;

\D:等价于[^0-9]范围;

\s:匹配任意的一位空格,可能是空格、换行、制表符;

\S:即对\s取反匹配任意的非空格数据;

\w:匹配字母、 数字、下划线, 等价于[a-zA-Z_0-9]

\W:匹配非字母、数字、下划线,等价于[^a-zA-Z_0-9];

4【边界匹配】

^:匹配边界开始;

$:匹配边界结束;

5【数量表示】默认情况下只有添加上了数量单位才可以匹配多位字符;

表达式?:该正则可以出现 0 次或 1 次;

表达式*:该正则可以出现 0 次、1 次或多次;

表达式+:该正则可以出现 1 次或多次;

表达式{n}:表达式的长度正好为 n 次;

表达式{n,}:表达式的长度为 n 次以上

表达式{n,m}:表达式的长度在 n~m 次;

6【逻辑表达式】可以连接多个正则

表达式 X 表达式 Y:X 表达式之后紧跟上 Y 表达式;

表达式 X | 表达式 Y :有一个表达式满足即可;

(表达式):为表达式设置一个整体描述, 可以为整体描述设置数量单位。

7【理解字符 \ 的含义】
\ 在 Java 中的含义

上左下右斜杠 \ 表示转义字符。转义字符的特点使其后面的字符消失意义。比如:英文字符右下引号 " 表示字符串的结束。如果我们想把下引号输出打印,只是作为一个英文字符,消失本来的意义,我们可是使用转义字符,如下:

System.out.printf("\"");

输出结果:
"

同理,如果我们想输出打印反斜杠 \ 必须再写一个反斜杠进行转义,如下:
System.out.printf("\\");

输出结果:
\
\ 在正则表达式中的含义

将下一字符标记为特殊字符、文本(原意字符)、反向引用或八进制转义符。例如:\\匹配\

\后面接上 字符 说明
特殊字符 \d 匹配0-9的数字
文本 \. 匹配英文句号
文本 \\ 匹配\
反向引用 \num 匹配 num,此处的 num 是一个正整数。例如,"(.)\1"匹配两个连续的相同字符。
八进制转义符 \nml 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。

例如,n 匹配字符 n。\n 匹配换行符。英文句号 . 匹配任意字符,\. 匹配英文句号 .

\ 出现在Java的正则表达式中处理

可以看出上左下右斜杠 \ 在Java中 和 正则表达式的不用含义。如果在Java中使用正则表达式,遇到反斜杠怎么处理?

给出结论:Java中两个反斜杠 \\ 表示 正则中的一个反斜杠 \

这是Java对正则表达式的支持规则,也有Python、C#、JS等语言对正则的支持规则,具体请参考 菜鸟编程

举例1:editor@csdn.cn

这是一个网址,需要用Java语言实现正则表达式进行匹配 :只用关注 \\. 这里。上面说过了,两个斜杠表示一个普通斜杠

String s = "editor@csdn.cn";
String regex = "[a-z0-9A-Z]\\w+@\\w+\\.(cn|com)";	//邮箱第一个字母不能是下划线
System.out.printf(s.matchs(regex));
举例2:ab\ab

如果在Java中要匹配上面的字符串,可以这样写:

String s = "ab\\ab";
String regex = "[a-z]{2}\\\\[a-z]{2}";
System.out.printf(s.matchs(regex));

解释一下为什么是四个反斜杠?

正则表达式在Java中应用需要符合Java规范。在Java中,两个斜杠表示一个斜杠(前一个是转义字符),因此四个斜杠匹配正则表达式中的两个斜杠;我们说在正则表达式中,两个反斜杠表示一个反斜杠,因此四个反斜杠,表示正则表达式中的一个没有意义的斜杠。

Java对正则的支持类-常用方法
java.util.regex 包中有对正则的支持类
String str = "a47";
String regex = "[a-z]\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
  	System.out.println(matcher.start());
    System.out.println(matcher.end());
    System.out.println(matcher.group());
    //  ......	Matcher里的各种匹配方法
}

start() 方法、end()方法、group()方法如果单独使用,查看源码发现会报错。需要配合 find() 方法使用。

if (this.first < 0) {
    throw new IllegalStateException("No match available");
}
- find() 方法

代码示例:

public static void main(String[] args) {
    String str = "ak47-ak47-CF";
    String regex = "\\d+";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    System.out.println(matcher.find());
    System.out.println(matcher.find());
    System.out.println(matcher.find());
}

输出结果:
true
true
false

find() 方法,会从头到尾拆分字符串进行遍历,有点像迭代器,匹配正则表达式命中返回 ture。

参考: Java正则表达式中Matcher类的find方法多次调用的匹配问题

- matches() 方法
public static void main(String[] args) {
   	String str = "7k";
    String regex = "\\d+";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    System.out.println(matcher.matches());
}

输出结果:
false

matches() 把整个字符串与正则匹配一次,并不像 find() 方法会拆分字符串进行匹配。符合就是true,否则是false。

- start() 方法
- end() 方法
public static void main(String[] args) {
     String str = "ak47";
     String regex = "\\d+";
     Pattern pattern = Pattern.compile(regex);
     Matcher matcher = pattern.matcher(str);
     while (matcher.find()) {
         System.out.println("start:"+matcher.start());
         System.out.println("end:"+matcher.end());
     }
}

输出结果(下标从零开始):
start:2
end:4

start() 匹配到开始位置 end()匹配到结束+1的位置。

- group() 方法
public static void main(String[] args) {
    String str = "ak47-ak47";
    String regex = "\\d+";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

输出结果:
47
47
public static void main(String[] args) {
    String str = "ak47";
    String regex = "([a-z]+)(\\d+)";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        System.out.println(matcher.group(0));	//也可以不带参数
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
    }
}

输出结果:
ak47
ak
47

group() 即 group(0) 指的是整个正则表达式匹配结果,group(1) 指的是第一个括号里的正则匹配结果,group(2) 指的第二个括号里的正则匹配结果。

举例3:校验手机号
不会吧不会吧,不会还有人还在手写正则吧?
package cn.hutool.core.util;

PhoneUtil.isMobile(String phone);
举例4:校验身份证号码

同理

package cn.hutool.core.util;

IdcardUtil.isValidCard(String idNo);

如果要看代码实现过程,可以点击去看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java对正则表达式的支持(手机、身份证校验) 的相关文章

随机推荐

  • 好用的插件介绍-Clear Cache Chrome插件

    clear cache插件是一款用于清理谷歌浏览器的chrome清理缓存插件 该插件支持清理应用程序缓存 缓存 Cookie 下载 文件系统 表单数据 历史 索引数据库 本地存储 插件数据 密码和WebSQL 你只需要在安装了这款插件后在设
  • VSCode中Python代码自动提示

    自己写的模块 VSCode中无法自动提示 可以按下面步骤试试 1 添加模块路径 文件 设置 首选项 搜索autoComplete 点击 在settings json中编辑 添加模块路径 python autoComplete extraPa
  • nrm安装与配置

    1 nrm安装与配置 npm 介绍 nrm npm registry manager 是npm的镜像源管理工具 有时候国外资源太慢 使用这个就可以快速地在 npm 源间切换 参考文章 西北码农 安装 在命令行执行命令 npm install
  • html 邮件乱码怎么办,如何解决html邮件乱码问题

    html邮件乱码的解决办法 1 在mail函数前一行打印message内容 2 将邮件内容保存为html文件后查看 3 设置UTF 8编码 本文操作环境 windows7系统 HTML5版 Dell G3电脑 如何解决html邮件乱码问题
  • Jenkins 持续集成:Linux 系统 两台机器互相免密登录

    背景知识 我们把public key放在远程系统合适的位置 然后从本地开始进行ssh连接 此时 远程的sshd会产生一个随机数并用我们产生的public key进行加密后发给本地 本地会用private key进行解密并把这个随机数发回给远
  • day21

    530 二叉搜索树的最小绝对差 先转换为有序list 再比较差值 501 二叉搜索树中的众数 先转换为有序list 再进行众数统计寻找 236 二叉树的最近公共祖先 后序遍历 再根据返回的值寻找祖先 package algor traini
  • 3d打印,机器人,计算机,3D打印的机器人将教孩子计算机编码!

    原标题 3D打印的机器人将教孩子计算机编码 随着我们的世界变得日益数字化的 越来越多的编码和计算机编程工作如雨后春笋般冒出 需要越来越多的人在编码语言 成为精通 这种先进的计算机知识将更加为下一代更重要 因为2024年 超过100万以上的编
  • Linux 三分钟学会虚拟机与外网和主机互通

    首先准备好一台安装好的虚拟机 字符界面也一样 配置虚拟网卡 添加一张虚拟网卡用来连接主机和虚拟机 通过图中步骤设置好 最后和最后那张图显示一样 确定 右击需要配置网络的虚拟机 单击添加 选中网络适配器 然后单击确定 点击自定义 然后选择刚刚
  • C++ 多态虚函数表(VS2013)

    对于含有虚函数的类 基类或者自身 自身非纯虚函数 的对象 都拥有一个指向虚函数表的指针 占一个指针大小的内存 在类成员变量之前 相当于第一个成员变量 多重继承的时候 几个基类就几个指针 就几个虚函数表 每个类的虚函数表确定了各个方法指向那个
  • Hadoop3.0.3 HDFS 常用shell 命令

    1 启动Hadoop start all sh root elk server sbin start all sh Starting namenodes on elk server 上一次登录 日 11月 24 21 57 43 CST 2
  • 【linux多线程(四)】——线程池的详细解析(含代码)

    目录 什么是线程池 线程池的应用场景 线程池的实现 线程池的代码 C linux线程 壹 初识线程 区分线程和进程 线程创建的基本操作 线程 二 互斥量的详细解析 线程 三 条件变量的详细解析 什么是线程池 线程池是一种线程使用模式 它是将
  • GDB 和 windbg 命令对照(转载)

    From http blog csdn net joeleechj article details 10020501 命令 windbg gdb 附加 attach attach 脱离附加 detach detach 运
  • CSS总结div中的内容垂直居中的六种方法

    一 行高 line height 法如果要垂直居中的只有一行或几个文字 那它的制作最为简单 只要让文字的行高和容器的高度相同即可 比如 p height 30px line height 30px width 100px overflow
  • VMware vSphere中三种磁盘规格(厚置备延迟置零\厚置备置零\Thin Provision

    在VMware vSphere中 不管是以前的5 1版本 或者是现在的6 5版本 创建虚拟机时 在创建磁盘时 都会让选择磁盘的置备类型 如下图所示 分为 1 厚置备延迟置零 2 厚置备置零 3 Thin Provision 精简置备 在创建
  • unity 基本寻径

    一 实现效果 敌人追逐玩家 自动躲避障碍物 二 游戏框架 Plane 平面 是玩家和敌人可以行走的区域 Player 玩家 可以在平面上移动 绕开障碍物 Enemy 敌人 可以追逐玩家 绕开障碍物 障碍物 五个正方体 玩家在移动的过程中和敌
  • java中,在一个类中调用另一个类的属性和方法

    在java当中 在一个类中调用另一个类的情况有多种 可能是调用不同包中的类 也可能是同包不同类 如果调用不同包中的类 需要先导入该包 然后才能调用 这里主要分享一个调用同包中的不同类的属性和方法的操作 比如这里有一个Card类和一个Card
  • ubuntu apt update 报错Err:6 https://download.docker.com/linux/ubuntu jammy InRelease

    目录 尝试清除已存在的软件源信息并重新添加 重新配置ubunut镜像源 我这边用的是阿里云的源 阿里源配置 Ubuntu换阿里云源后更新提示 GPG error缺少公钥解决方法 尝试清除已存在的软件源信息并重新添加 Clear your p
  • oracle.数据的增删改、事务、创建表、修改表、删除表

    一 数据的增删改 1 备份表 01 全表备份 CREATE TABLE 新表名 AS 子查询 将emp表全表备份 CREATE TABLE emp bak AS SELECT FROM emp SELECT FROM emp bak 02
  • java JLabel改变大小后如何刷新_到底一行java代码是如何在计算机上执行的

    不知道你是否思考过 每次我们在IDEA中右键Run Application启动主方法 假如程序运行正常 控制台也打印出了你所要打印的信息 在这个过程中你知道这台计算机上那些硬件及其软件都是以什么样的方式参与到这个过程吗 今天我们就分析梳理下
  • Java对正则表达式的支持(手机、身份证校验)

    目录 1 数量 单个 字符匹配 2 数量 单个 字符集 可以从里面任选一个字符 3 数量 单个 简化字符集 4 边界匹配 5 数量表示 默认情况下只有添加上了数量单位才可以匹配多位字符 6 逻辑表达式 可以连接多个正则 7 理解字符 的含义