正则表达式

正则表达式 Regular Expression

和 语言无关、但大部分主流编程语言都兼容的 这种 处理 字符串的 表达式 。在 编程语言中, 通常 会将 正则表达式 简写为 regex 、 regexp 、 re

正则表达式 是对 字符串操作的 一种 扩展 和补充 。

正则表达式 可以 对 字符串 进行 检索提取替换 等操作。

正则 表达式 是由 一组 特殊 的 字符 组成的 模式匹配串 Pattern、本质上是一个字符串。在 Python 使用 Pattern 类 来表示正则表达式

RegexBuddy4.exe

这个软件 是 辅助学习 正则 匹配 规则 的软件。

正则匹配规则

基础规则

  • xyz : 匹配 字符串中的 xyz , 这里面的 xyz 是一个泛指,可以代表任意字符( 除特殊字符 )

  • xyz\] : 匹配 x , y , z 中的 任意 一个 字符 `-` 在中括号中 有特殊含义 ,可以表示一个区间 ,且 区间 均包含 , 如果 - 无法 表示区间, 则 回复原意,用来匹配 `-` [A-Z] : 匹配 26个 大写字母 [a-z] : 匹配 26个 小写 字母 [0-9] : 匹配 任意一个 阿拉伯数字 字符 [0-] : 匹配 0 或者 - [a-zA-Z0-9] : 匹配任意一个字母 或数字 字符 [0-2457-9] : 匹配 除 3 和 6 之外的 任意一个 数字 字符

    [^0-9] : 匹配任意一个 非数字 字符
    [0-9^] : 匹配任意一个 数字字符 或者 ^

  • \d : 匹配 任意一个数字字符、等价于 [0-9]

  • \D : 匹配 任意一个 非数字字符 、 等价于 [^0-9]

  • \w : 匹配 任意一个 单词(字母、数字、下划线)字符 , 等价于 [a-zA-Z0-9_] , 在 Python 中 \w 还能匹配 中文 字母

  • \W : 匹配 任意一个 非单词(字母、数字、下划线、中文字母)字符 和

  • \s : 匹配 任意一个 空白符 (空格、 制表符、换行符) 如果只匹配空格,可以直接写 空格、 制表符 \t , 换行符 \n

  • \S : 匹配 任意一个 非空白符

  • \b : 代表一个单词 边界、不能单独时候,需要配合其他正则使用

  • . : 匹配 除了 换行符 之外的 其他任意一个 字符

  • \. : 匹配一个小数点 、对特殊字符的匹配 可以使用 \ 进行转移

多字符匹配规则

X 代表 基础规则

  • X{n} : X 匹配 n 个

  • X{n,} : X 至少匹配 n 个, 尽可能多的匹配

  • X{n,m} : X 至少匹配 n 个 , 最多 匹配 m 个 , 要求 : m >= n

    1[3-9]\d{9} # 匹配一个手机号

    匹配一个邮箱 a) 有且只有一个 @符号 ,b) @符号前面的内容是 邮箱账号 , 账号由 字母、数字、下划线组成、长度 4-20

    c) @符号后面的内容格式是 xx.xx 或者 xx.xx.xx 这里面的 xx 由 字母、数字、下划线组成 。 xx 的长度,长度 2 - 5

    [a-zA-Z0-9_]{4,20}@[a-zA-Z0-9_]{2,5}(.[a-zA-Z0-9_]{2,5}){1,2}

贪婪式匹配规则

  • X* : X 至少匹配 0个 , 等价于 X{0,}

  • X+ : X 至少匹配 1个 , 等价于 X{1,}

  • X? : X 最多 匹配 1个 , 等价于 X{0,1}

    匹配一个邮箱 a) 有且只有一个 @符号 ,b) @符号前面的内容是 邮箱账号 , 账号由 字母、数字、下划线组成.

    c) @符号后面的内容格式是 xx.xx 或者 xx.xx.xx 这里面的 xx 由 字母、数字、下划线组成 。 xx 的长度

    [a-zA-Z0-9_]+@[a-zA-Z0-9_]+(.[a-zA-Z0-9_]+){1,2}

非贪婪式匹配规则

在 贪婪式匹配规则 的 后面 添加 一个 ? 形成非贪婪式匹配规则 。 非贪婪式 往往在使用的时候 不会出现在正则的尾部

如果 整个表达式 是一个 非贪婪式 , 那么 效果 和 贪婪式 是一样的

如果 非 贪婪式 前面 有表达式、 后面没有表达式 ,那么此时 非贪婪式 会 尽可能少的 匹配。

如果 非贪婪式 后面 有表达式 、后面表达式 会优先 匹配 内容,然后 前面符合要求的数据 均 交给 非贪婪式 匹配。

  • x*? : X 至少匹配 0个

  • X+? : X 至少匹配 1个

  • X?? : X 最多 匹配 1个

    \d+? : 匹配 多个数字组成 的内容, 表现和 贪婪式 相同

    3\d+? : 匹配 3和 一个数字 、 此时 非贪婪式 尽可能少的 匹配 内容

    \d+?3 : 在 字符串中 找到 第一个 3 的位置, 3前面的多个数字(至少一个) 尽可能多的匹配 。

分组 ( ... )

在编写正则表达式的时候, 可以 使用 小括号 将 某一部分规则 括起来 形成一个 组 。

分组 后 , 每一组的 匹配的 数据 可以 更加方便地 进行 提取 。 组是一个整体。

  • 非捕获分组 (?: )

    使用了 ?: 的 组 就 不在 是 组了 , 而只是 一个 整体

    复制代码
    [a-zA-Z0-9_]+@[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+){1,2}
  • 命名捕获分组 (?P<name>)

    在 Python 中 使用 (?P<name>) , 在 Java 或者 Javascript中 使用 (?<name>)

    复制代码
    (?<account>[a-zA-Z0-9_]+)@[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+){1,2}
  • 分组 引用 \n : n 是组的编号、是一个数字

    \n 代表 引用 第 n 组 正则 匹配的内容 作为 匹配的内容 。

选择 |

复制代码
编写 一个 身份证 正则表达式 ,用来 提取 年份 、月份、日 , 且 年份 必须在 1900  ~ 2099  ,  月份 01 ~ 12  , 天 01 ~ 31

[0-9]\d{5}(?P<year>(?:19|20)\d{2})(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]

限定符

限定符 一般 用来 做 数据校验

  • ^ : 如果 ^ 符号 出现在 正则表达式的 最前面, 代表 以 ... 开头 。

  • $ : 如果 $ 符号 出现在 正则表达式的 尾部 , 代表 以 ... 结尾

    [\u4e00-\u9fa5] # 匹配中文字符区间

断言(预测)

正则在前 ,断言在后 为 正向 断言。 否则为 反向 断言。

  • 正向确定断言 (?=)

    \d+?(?=5) # 匹配 数字 、且 数字 后面一定是 5

  • 正向否定断言 (?!) :

    复制代码
    \d+?(?!5)    #  匹配 数字 、且 数字 后面一定不是 5
  • 反向确定断言 (?<=)

    复制代码
    (?<=5)\d+    #  匹配 数字 且 数字 前面一定 是 5
  • 反向否定断言 (?<!)

    复制代码
    (?<!5)\d+    #  匹配 数字 且 数字 前面一定 不是 5
相关推荐
Cat_Rocky4 分钟前
利用Packet Tracer网络实验
linux·运维·服务器
网络安全许木29 分钟前
自学渗透测试第21天(基础命令复盘与DVWA熟悉)
开发语言·网络安全·渗透测试·php
川石课堂软件测试1 小时前
软件测试:典型面试题库
数据库·python·功能测试·mysql·单元测试·grafana·prometheus
爱学习的小囧1 小时前
ESXi VMkernel 端口 MTU 最佳设置详解
运维·服务器·网络·php·虚拟化
Lucifer三思而后行2 小时前
zCloud 纳管 MySQL 8.4 数据库
数据库·mysql·oracle
eRTE XFUN2 小时前
docker 安装 mysql
mysql·adb·docker
WangJunXiang62 小时前
GFS分布式文件系统
开发语言·php
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香2 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
程序员老邢2 小时前
【技术底稿 19】Redis7 集群密码配置 + 权限锁死 + 磁盘占满连锁故障真实排查全记录
java·服务器·经验分享·redis·程序人生·微服务