正则表达式

2023-05-16

目录

案例引入

正则表达式

命名规范

结构组成

用途场景

Java中的正则校验

正则元字符

正则:普通字符

正则:\d 

正则:\D

正则:\w

正则:\W 

正则:\s

正则:\S

正则:.

正则:| 

正则:[abc]

正则:[^abc]

正则:[a-z]

正则:[^a-z]

正则:\num

正则:?

正则:+

正则:{n}

正则:{n,m}

正则:*


案例引入

在讲正则表达式前,我们不妨先从一个场景来逐渐引入。

你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图)。

根据上图,我们将密码设置规则可以描述为两个条件:

(1)长度为6-16位;

(2)密码中必须包含数字,大写字母,小写字母,特殊字符(指定字符);

现在假设我们不知道正则表达式,作为程序员的你,该如何去实现这样一个密码验证呢?

下面是我写的一个校验方法(样本):


   
   
  1. /**
  2. * 校验用户密码是否满足设置规则
  3. *
  4. * @param password 用户输入的密码
  5. * @return true-满足;false-不满足
  6. */
  7. public static boolean checkPassword (String password) {
  8. // 密码不能为空
  9. if (password == null || password.isEmpty()) {
  10. return false;
  11. }
  12. // 校验密码长度(6-16位)
  13. int len = password.length();
  14. if (len < 6 || len > 16) {
  15. return false;
  16. }
  17. // 定义四种组合条件
  18. boolean hasNumber = false;
  19. boolean hasSmallLetter = false;
  20. boolean hasBigLetter = false;
  21. boolean hasSpecialChar = false;
  22. // 将密码字符串拆分为单个字符,然后对每个字符进行校验
  23. char[] chars = password.toCharArray();
  24. for ( char c : chars) {
  25. // 是否包含数字0-9
  26. if (c >= '0' && c <= '9') {
  27. hasNumber = true;
  28. continue;
  29. }
  30. // 是否包含小写字母a-z
  31. if (c >= 'a' && c <= 'z') {
  32. hasSmallLetter = true;
  33. continue;
  34. }
  35. // 是否包含大写字母A-Z
  36. if (c >= 'A' && c <= 'Z') {
  37. hasBigLetter = true;
  38. continue;
  39. }
  40. // 是否满足指定的特殊字符
  41. if ( "~@#S%*_-+=:.?".indexOf(c) > 0) {
  42. hasSpecialChar = true;
  43. continue;
  44. }
  45. // 如果某个字符不在上面四种情况,则不满足规则
  46. return false;
  47. }
  48. // 如果四种组合条件均满足,则符合密码设置规则
  49. return hasNumber && hasSmallLetter && hasBigLetter && hasSpecialChar;
  50. }

这个方法写得对不对呢?我们不防用几组密码去进行验证下:

可以看到,我们列举的8组密码,都得到了验证,说明我们的方法是OK的。

但这样一个密码设置规则校验,我们就差不多写近 30 行的代码,是不是感觉有点累赘了呢?明明规则很简单,代码量却写了这么多,有没有什么方法可以简化我们的代码呢?当然有!于是,这时就可以让我们今天的主角正则表达式出场了。

下面,则是具有相同校验功能,基于正则表达式的验证方法:


   
   
  1. /**
  2. * 通过正则表达式校验用户密码是否满足设置规则
  3. *
  4. * @param password 用户输入的密码
  5. * @return true-满足;false-不满足
  6. */
  7. public static boolean checkPasswordByRegex (String password) {
  8. return Pattern.matches( "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#S%*_\\-+=:.?])[A-Za-z0-9~@#S%*_\\-+=:.?]{8,20}$", password);
  9. }

那么它写得到底对不对呢?于是,我们可以通过上面的示例数据,继续调用该方法来进行验证:

通过结果我们可以看到,他也是符合我们预期的。于是我们发现,在不用正则表达式的时候,我们的代码量近30行,而使用了正则表达式,代码就浓缩为了1行,也就是说,使用正则表达式时可以简化我们的代码。

但同时我们也可知,正则表达式具有一定的学习成本,如果你不懂正则表达式,那么你看它可能就是一头雾水,如果出了问题,更也就无从下手去修改它了。

所以,学会正则表达式还是有必要的,至少以后你的同事写出来后,不会在脑子里出现 "这是写的啥玩意儿啊?怎么我看不懂" 的想法。

正则表达式

什么是正则表达式?通过上面的案例大家可能多少有点了解了。是的,他就是通过一行字符串,来描述一定的规则(如下图箭头所指红框处)。

命名规范

正则表达式的英文为 Regular Expression,所以我们通常采用这两个单词的首几个字母合在一起,把正则表达式相关的变量名定义为 regexp(单数) 或 regexps(复数) 。

比如:

又比如,在 Java 的 String 类中,有几个相关替换的方法,它也是支持正则表达式的,他的参数命名也是 regex 。

结构组成

正则表达式通常由一些普通字符,以及一些元字符组成。

普通字符:就是本身作为一个字符时,它不具有其他含义,像我们常用的大小写字母和数字。

元字符:就是除了本身作为一个字符外,他还可以表达其他含义(下图是部分元字符节选)。

 其实,我们学习正则表达式,大部分就是基于元字符的学习。

用途场景

学习了正则表达式,我们可以有哪些用途场景呢?

(1)做字符串的规则验证(比如前面的案例引入中,我们可以通过正则表达式来验证一个密码是否符合规则)。

(2)做字符串的替换(比如将一个字符串中所有的大小写字母去掉,或者替换为指定符号)。

(3)提取字符串中所需要的字符(比如一个字符串中所有的数字提取出来,组成一个新的字符串)。

Java中的正则校验

正则表达式主要用途就是校验字符串,那么在Java中,只需要通过下面这个方法即可进行校验。

boolean result = Pattern.matches(regex, input);
   
   

其中:

regex 是我们需要写的正则表达式校验规则;

input 是我们待校验的字符串;

返回的 result 就是我们校验的结果,当为 true 的时候,表示校验通过,当为 false 的时候,则表示校验不通过。

正则元字符

正则:普通字符

当我们的正则表达式为一串普通字符(不包含元字符)时,校验字符串只有和正则一致时,才会校验通过。

具体效果如下:

说明:后面例子为节省篇幅,不显得累赘,就不再贴代码,只贴校验结果。

正则:\d 

\d 表示一个数字。

如:

aaa\d: 表示验证的字符串后面必须以 aaa 开头,且以一个数字结尾。

aaa\dbbb:aaa和bbb中间有一个数字

 aaa\d\d:aaa后面跟2个数字

 

注意:在Java定义的正则里,由于一个\表示的是字符串转义,因此在Java定义带有\的元字符时,还需要多写一个\,即\\,至于其他语言,自己可查阅相关资料进行了解。

正则:\D

\D 表示一个非数字,它和上面 \d 的意思恰好相反。

如:

\D\D\D: 则表示一个长度为3,不包含数字的字符串。

111\D222:则表示111和222中间,必须包含一个非数字。

正则:\w

\w 表示一个字母(大小写均可)、数字,或下划线。

如:

12\w45:则表示12和45中间必须是一个字母,数字,或下划线。

正则:\W 

\W 与 \w 相反,表示这个位置的字符既不是字母、数字,也不是下划线。

也就是:特殊符号(除下划线),或者空格等满足。

如:

12\w45:则表示12和45中间是一个非字母,非数字,或非下划线。

正则:\s

\s 表示匹配一个看不见的符号,即空格或制表符(Tab键)

如:

88\s99:则表示88和99中间须是一个空格或制表符。

(由于我的编辑器设置了1个制表符替换为4个空格,所以这里就不列举制表符情况了)

正则:\S

 \S 与 \s 相反,表示一个可以看得见的符号。

如:

88\S99:则表示88和99中间须有一个看得见的符号。 

正则:.

 . (小数点) 则表示“\n”和"\r"之外的任何单个字符。

如:

.... :则表示任意四个字符

正则:| 

| (竖线) 则表示或的关系,表示检测的字符串须满足其中一个时,才符合条件。

如:

aa|bb|cc:则表示输入的字符串须是aa,或bb,或cc其中的一个。

 

注意,如果我们或者关系的前后还有其它字符时,需要用()将他们包裹起来。

如:

xx(aa|bb|cc)yy:则表示输入的字符串须是xx开头,yy结尾,且中间是aa,或bb,或cc其中的一个。

正则:[abc]

[ ] 表示匹配其中任意一个字符。

如: 

a[bcd]e:则表示a和e的中间须是b,或c,或d其中的一个

注意:用 | 表示其中之一,他可以是字符,也可以是字符串。而只用中括号时,则只表示其中一个字符。

正则:[^abc]

[^ ] 表示不与中括号里的任意字符匹配。

如: 

a[^bcd]e:则表示a和e的中间除b,c,d这三个字符外,其他的字符都满足。

正则:[a-z]

[值1-值2] 则表示值1到值2中间的所有字符都满足(包括值1和值2)。常用该正则来表示大小写字母范围,数字范围。

如:

a[b-d]e:等同于 a[bcd]e,因为 b-d 其实就是b,c,d三个数。

 a[0-9]e:则表示a和e中间是一个数字,等同于 a\de(前面说过\d表示一个数字)

 

正则:[^a-z]

[^值1-值2] 则表示除值1和值2之外的所有字符,都可以满足。

如:

a[^1-3]e:则表示a和e中间的字符,只要不是1,2,3,则都满足。

正则:\num

这里的num指number,也就是数字,当\后面跟数字,表示匹配第几个括号中的结果。

比如:现在有 abcd 字符串,当我们用小括号把 c 包裹起来后,然后在字符串后面写上 \1,即 ab(c)d\1,则这里的 \1 就指 c,因为 \1 表示第1个小括号中的结果。

ab(c)d\1:等同于 abcdc 。

如果我们继续把 ab(c)d\1 中的 d 包括起来,并在后面写上 \2,即 ab(c)(d)\1\2, 那么这里的 \2 就表示 d 这个字符,因为第2个小括号的结果是 d,所以整个表达式就等同于 abcdcd 。

ab(c)(d)\1\2:等同于 abcdcd,也等同于 ab(cd)\1 。

正则:?

? 表示匹配前面的子表达式零次或一次。

如:

abc?de: 表示可匹配的字符串为 abde (匹配0次c) 或 abcde (匹配1次c)。

正则:+

匹配前面的子表达式一次或多次 (次数 >= 1,即至少1次)

如:

abc+de:ab 和 de 之前至少有一个 c 。

正则:{ n}

这里的 n 是一个非负整数。匹配确定的前面的子表达式 次。

如:

 abc{3}de:表示 ab 和 de 之间有3个c。

 ab(xx|yy){3}de:表示 ab 和 de 之间有 xx 或 yy 的个数, 一起合计为3个。

正则:{n,m}

m和n均为非负整数,其中 n<=m。最少匹配 n 次且最多匹配 m 次。

如:

abc{2,3}de:表示 ab 和 de 之间有 2 到 3 个 c。

正则:*

表示匹配前面的子表达式任意次。

如:

abc*de:表示 ab 和 de 之间有任意个数(包括0)c 。

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

正则表达式 的相关文章

  • 去除多余的0;正则表达式:去掉数字(整数、小数)前面多余的零

    方案1 来源 http zhidao baidu com question 277893180 html 如果是整数 去掉整数前的零 例如 0098765 gt 98765 如果是小数 去掉小数前的零 例如 000 333 gt 0 333
  • perl regex是什么_如何在Perl单行代码中使用Regex匹配多行

    perl regex是什么 Perl one liners with perl s regular expression statement can be a very powerful text processing tools used
  • Java对正则表达式的支持(手机、身份证校验)

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

    正则表达式是对字符串操作的一种逻辑公式 就是用事先定义好的一些特定字符 及这些特定字符的组合 组成一个 规则字符串 这个 规则字符串 用来表达对字符串的一种过滤逻辑 1 匹配字母 大写 小写 和数字的字符 正则表达式 a zA Z0 9 2
  • C语言的一个正则表达式pcre

    1 简介 在C C 中 一个比较好的正则表达式是pcre 被很多工具 包括一些商用工具 使用 2 源码下载 安装 2 1 下载 可以从官网http www pcre org 下载 为方便学习 已放在这里http download csdn
  • 常用数字电路模块之三:计数器与分频器(二))

    三 分频电路 1 简单的计数器 计数器实质是对输入的驱动时钟进行计数 所以计数器在某种意义上讲 等同于对时钟进行分频 例如一个最大计数长度为N 2 n 从0计数到N 1 的计数器 也就是寄存器位数位n 那么寄存器最高位的输出为N 2 n分频
  • js验证邮箱的正则表达式

    最近小小研究了一下正则表达式 觉得写正则表达式还挺有意思的 先想推荐一个网址 把正则表达式的基本语法都总结了 很不错 https msdn microsoft com zh cn library ae5bf541 v vs 100 aspx
  • VB.Net常用的正则表达式(实例)

    d 非负整数 正整数 0 0 9 1 9 0 9 正整数 d 0 非正整数 负整数 0 0 9 1 9 0 9 负整数 d 整数 d d 非负浮点数 正浮点数 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1
  • Nmap源码分析(服务与版本扫描)

    Nmap源码分析 服务与版本扫描 2012年8月23日 在进行端口扫描后 Nmap可以进一步探测出运行在端口上的服务类型及应用程序的版本 目前Nmap可以识别几千种服务程序的签名 Signature 覆盖了180多种应用协议 比如 端口扫描
  • Pattern.compile的flag参数

    Pattern compile函数 Pattern Pattern compile String regex int flag regex为正则表达式 flag的取值范围如下 Pattern CANON EQ 当且仅当两个字符的 正规分解
  • 正则表达式大全,一篇前后端都可用

    正是掌握了这些正则表达式 冰河平均每天比别人少写200行代码 极大的提高了研发效率 熟练的掌握正则表达式 能够帮助程序员以最快的速度写出最优雅的代码 冰河在多年的编程工作中 对使用过的正则表达式进行了梳理和总结 这些正则表达式能够帮助你节省
  • 正则实现去除字符串前后空格

    前言 正则去掉字符串前后空格 1 去除左空格 str1是处理后的 let str1 str replace s g 2 去除右空格 str2是处理后的 let str2 str replace s g 3 去除左右空格 let str3 s
  • 用Requests和正则表达式爬取猫眼电影(TOP100+最受期待榜)

    目标站点分析 目标站点 猫眼榜单TOP100 如下图 猫眼电影的翻页offset明显在URL中 所以只要搞定第一页的内容加上一个循环加上offset就可以爬取前100 流程框架 1 抓取单页内容 利用requests请求目标站点 得到单个网
  • 空格的正则表达式

    在正则表达式想使用空格的时候不能采用 s的方法 因为 s指的是空白 就是所有空白 如果想表示单纯的空格的话可以采用 方括号本身就是匹配其中的字符 那么其中放空格就是匹配空格 如果有其他正则表达式问题可以查看 https blog csdn
  • Python命令行参数定义及注意事项

    在命令行中运行python代码是很常见的 下面介绍如何定义命令后面跟的参数 常规用法 Python代码中主要使用下面几行代码来定义并获取需要在命令行中赋值的参数 import argparse parser argparse Argumen
  • JS字符串替换函数全部替换方法

    color olive JS字符串替换函数 Replace 字符串1 字符串2 1 我们都知道JS中字符串替换函数是Replace 字符串1 字符串2 但是这个函数只能将第一次出现的字符串1替换掉 那么我们如何才能一次性全部替换掉了 将上面
  • 表示数值的字符串(含思路解答示意图)【剑指offer——JAVA实现】

    题目描述 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值 但是 12e 1a3 14 1 2 3 5 和 12e 4 3 都不是 解法一 思路 状态机
  • 正则表达式(日期、金额、特殊字符)_java语言

    正则表达式 java 正则表达式在线测试网站 个人觉得还算精确 http tool chinaz com regex 备注 如有错误 希望留言指出 虚心请教 金额格式 正数 包含至多2位小数 第1种形式 校验金额格式是否正确 正数 包含至多
  • 超详细!Jmeter性能测试(二)

    Jmeter 性能测试 二 关联 正则表达式提取器和JSON Extractor提取器 接入上篇博文继续 上篇地址 https blog csdn net weixin 44954642 article details 103054387
  • 【Python】Python 模式匹配与正则表达式

    Python 模式匹配与正则表达式 1 模式匹配与正则表达式 你可能熟悉文本查找 即按下Ctrl F 输入你要查找的词 正则表达式 更进一步 它们让你指定要查找的 模式 你也许不知道一家公司的准确电话号码 但如果你住在美国或加拿大 你就知道

随机推荐

  • 想听一首歌好难?程序员教你一键下载

    1 首先要先安装一下Python第三方库 requests pip install requestsprettytable pip install PrettyTable 2 使用的开发环境 xff1a 版 本 xff1a python 3
  • 圣诞要到了~教你用Python制作一个表白神器——照片墙,祝你成功

    马上圣诞节 xff0c 快到了 xff01 又到了一年一度表白的时候了 今天教你一个程序员方式的表白 xff01 看一下效果图 xff1a 要什么样的 xff0c 图案都可以自定义的 首先 xff0c 准备阶段 收集你喜欢人 xff08 或
  • python字典遍历

    对python中的字典进行遍历操作 a span class token operator 61 span span class token punctuation span span class token punctuation spa
  • python读取文件指定行的三种方法

    1 行遍历实现 在python中如果要将一个文件完全加载到内存中 xff0c 通过file readlines 即可 xff0c 但是在文件占用较高时 xff0c 我们是无法完整的将文件加载到内存中的 xff0c 这时候就需要用到pytho
  • Python中五种方式拼接字符串的正确方法

    在学习Python xff08 3x xff09 的过程中 xff0c 在拼接字符串的时候遇到了些问题 xff0c 所以抽点时间整理一下Python 拼接字符串的几种方式 方式1 使用加号 43 连接 使用加号连接各个变量或者元素必须是字符
  • Python类与对象详解

    一 类和对象 类的意思 xff1a 种类 分类 类别 对象是特征与技能的结合体 xff0c 我可能有身高体重 而你也有身高体重 xff0c 所以你会说你像我 xff0c 但是你一定不会说你像阿猫阿狗 并且我和你其实就可以说成是一类 xff0
  • Python如何连接Mysql及基本操作

    1 什么要做python连接mysql xff0c 一般是解决什么问题的 做自动化测试时候 xff0c 注册了一个新用户 xff0c 产生了多余的数据 xff0c 下次同一个账号就无法注册了 xff0c 这种情况怎么办呢 xff1f 自动化
  • python中sort和sorted的高级排序技巧

    Python list内置sort 方法用来排序 xff0c 也可以用python内置的全局sorted 方法来对可迭代的序列排序生成新的序列 1 排序基础 简单的升序排序是非常容易的 只需要调用sorted 方法 它返回一个新的list
  • python用户定义的迭代器

    1 迭代器基于下面两个个方法 xff1a xff08 1 xff09 next 返回容器的下一个项目 xff08 2 xff09 iter 返回迭代器本身 2 当序列遍历完时 xff0c 将抛出StopIteration异常 xff0c 所
  • 虚拟机管理和虚拟机快照

    虚拟机管理 virt manager 开启图形管理工具 virt viewer vmname 显示虚拟机 vmname表示虚拟机名称 virsh list 列出正在运行的vm virsh list all 列出所有vm virsh star
  • 卷积神经网络中的图像特征——以YOLOv5为例进行可视化

    目录 一 图像特征1 图像低层特征2 图像高层特征3 示例 二 特征融合1 多尺度特征融合2 FPN 参考文章 一 图像特征 1 图像低层特征 图像低层特征指的是 xff1a 边缘 颜色和纹理等特征 低层特征的分辨率较高 xff0c 包含较
  • web端mpr(多平面重建)的实现

    mpr 二维多平面重建 Multiplanar reconstruction xff0c MPR 是被大量用于分析电脑断层扫描影像的技术 可用于在正交平面 冠状 矢状 轴向或倾斜 xff0c 选择任意平面 中重建影像 xff0c 这可以帮助
  • 带参数和不带参数装饰器区别

    usr bin env python 2 encoding utf 8 3 def start info 4 print 39 电视剧开头曲 39 5 print 39 开始唱歌 39 6 def end info 7 print 39 电
  • python字典get方法

    python中字典的get方法 xff0c 返回对应key的value值 xff0c 并可以指定默认值 a span class token operator 61 span span class token punctuation spa
  • Java中collection和collections的区别和作用

    其实很久之前就想写一篇了 xff0c 主要是加深印象 因为我一次面试的时候 xff0c 我和面试官侃侃而谈 xff0c 你一句啊我一堆 xff0c 你一句啊我一堆 xff0c 就在这时 xff0c 面试官让我谈谈collection和col
  • 关于阅读论文的一些感想

    关于阅读论文的一些感想 最近看了一些论文 xff0c 也和同学在交谈中学习到了一些关于阅读时应该有的态度 xff0c 这里记录一下 原文地址 xff1a https www yuque com lart papers dgrl EpF76
  • Centos 8中使用Packstack(RDO)快速安装openstack Victoria版

    OpenStack介绍 openstack详细介绍及常用命令请查看此文 通过Packstack RDO 部署OpenStack xff0c 官方文档点击此处查看 安装环境 工具 xff1a VMware Workstation 16 Pro
  • Ubuntu14.04安装内核

    0 前言 Ubuntu14 04安装Linux头文件 和 Ubuntu14 04安装Linux源码 分别介绍了Ubuntu14 04中安装Linux头文件和源码的方法 xff0c 这里进一步介绍安装Linux内核镜像的方法 1 安装内核镜像
  • cocos2d-remove和fastremove问题详解

    在用CCARRAY FOREACH的时候 Ref obj CCARRAY FOREACH obj array 当你在上面的宏里面执行remove的时候 xff0c 在这一帧里面 头指针 xff0c 和尾指针是不动的 所以当你用了array
  • 正则表达式

    目录 案例引入 正则表达式 命名规范 结构组成 用途场景 Java中的正则校验 正则元字符 正则 xff1a 普通字符 正则 xff1a d 正则 xff1a D 正则 xff1a w 正则 xff1a W 正则 xff1a s 正则 xf