正则表达式

正则表达式 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
相关推荐
海石1 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石1 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
不像程序员的程序媛1 小时前
系统cpu内存负载资源分析
运维·服务器·数据库
我叫黑大帅3 小时前
MySQL 并发插入竞态问题:原子写入实践指南
后端·mysql·面试
Jerry3 小时前
LeetCode 151. 反转字符串中的单词
算法
我会尽全力 乐观而坚强4 小时前
MySQL零基础入门(二)
数据库·mysql·adb
万联WANFLOW5 小时前
多分支企业组网,IP 网段到底该怎么规划
开发语言·php
耍酷的魔镜5 小时前
谈谈如何使用Netty开发实现高性能的RPC服务器
服务器·网络协议·rpc
a1117765 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜5 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai