正则表达式

正则表达式 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
    
相关推荐
鲸大鱼的自我修养30 分钟前
延时系统建模,整数延时与分数延时,连续传函与离散传函,Pade近似与Thiran近似,Matlab实现
开发语言·线性代数·算法·matlab·自动化
一休哥助手30 分钟前
使用 Docker 容器创建一个 Web 服务器:从入门到实践
服务器·docker
神经美学_茂森1 小时前
【通俗理解】神经网络中步长缩小的奥秘:优化算法与卷积操作的影响
网络·神经网络·算法
一路向北North2 小时前
Java使用replaceAll替换时不使用正则表达式
java·开发语言·正则表达式
yangfeipancc3 小时前
正则表达式
java·开发语言·正则表达式
bpmf_fff3 小时前
十二、正则表达式、元字符、替换修饰符、手势和对话框插件
正则表达式
Duck Bro3 小时前
MySQL:常用数据类型
java·数据库·c++·mysql·java-ee
淘淘 小窝3 小时前
springboot配置多数据源mysql+TDengine保姆级教程
spring boot·mysql·tdengine
double丶flower4 小时前
设置Mysql5.6允许外网访问
java·mysql