正则表达式

正则表达式 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 之外的 任意一个 数字 字符

  • \^xyz : 匹配 除 x, y, z 三个字符之外的 其他任意一个 字符 ^ 作为在 中括号 的第一个字符时,代表 非的意思、出现在 中括号其他位置 均表示 ^

    [^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
相关推荐
Navigator_Z2 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
tedcloud1234 小时前
DeepSeek-TUI部署教程:打造CLI AI助手环境
服务器·人工智能·word·excel·dreamweaver
无情的西瓜皮4 小时前
MCP协议实战:用Python从零搭建一个AI Agent工具服务器(保姆级教程)
服务器·人工智能·python·mcp
云泽8084 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
lzhdim5 小时前
SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析
数据库·sql·mysql·json
万能的知了5 小时前
服务器托管 vs 云主机 vs 裸金属:一个决策故事
运维·服务器·云计算
wlsh155 小时前
Go 迭代器
算法
骄马之死5 小时前
MySQL-InnoDB 核心原理
mysql
语戚5 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
kingwebo'sZone5 小时前
在Cent上安装Mysql 8.0的遇到的问题和解决办法
数据库·mysql·adb