正则表达式

正则表达式

Winter Lv4

引言

  • 从前我们学习了KMP算法文本匹配,但是现在我们的这个正则表达式,提供一种单独的语法解决,但是KMP算法仍有很多局限且消耗算力,为了解决网络中的大量匹配问题,引入伟大的正则表达式,用于匹配与替换。

  • 编程语言中我们使用的转义字符等有一定出处,正则表达式最初来自我们的unix机器

  • 简单的语法

    • 纯文本匹配

      直接匹配文本,区分大小写,通常只返回第一个,可以编程语言中选择返回所有的数组。

    • **.号**匹配

      . 可以指代包括.在内的所有符号 匹配本身时引入了伟大的转义符号 \

    • 匹配想要中的字符

      使用[],[]中的只要满足一个就算是匹配 常常用在不区分大小写的表示 [Cc][Aa][Tt].eg 事实上我们的markdown都有转义字符

      • 集合表示

        一个自然的过渡,如果,集合中元素很多时,且连续,使用[A-Z] 遵循阿斯克码

      • \ 与-都是元字符 -不需转义

      • 多个集合匹配

        举个例子[A-Za-z0-9]就是有三个集合 网页的十六进制颜色表示就是一种应用 [0-9A-Fa-f]

    • 取非匹配

      • 使用元字符^ 且作用于集合 注意是在集合的内部 求非 代表一个[^]因为具有多义性
    • 元字符匹配

      • 使用转义字符匹配

      • [] - ^ \ . +

      • 特殊的元字符
        • \f 换页符 \n换行符 \r回车符 \t制表符 \v垂直制表符 [\b]backspace
        • 举个例子 处理 CSV文件 , 变成空格
        • windows 中 \r\n 表示换行 linux \r可选 \n 必选
      • 对集合的简化
        • \d 所有的数字=[0-9] \D=[^0-9]
        • \w 所有字母大小写与数字 \W 所有的非
        • \s 任何一个空字符 \f\n\r\v\t \S
        • 十六进制与八进制 \0x \0 \c 控制字符
        • POSIX字符的支持 格式[: 英文描述:]
      • 重复匹配
        • 元字符 [0-9]+ 0-9中的数字的一个以上 不能0个
        • 举个例子 关于邮箱地址的匹配
          • \w@\w\.\w 升级
          • \w+@\w+\.\w+
          • 升级\[\w.]+@\[\w\.]+\.[\w.]+ 注意这个例子可以看出我们的在[]里所有的元字符都可以看作是普通字符 但是转义了也没有错误
    • *元字符

      • 可以匹配0次与任意次 相当于 + 的升级版
      • \w+[\w.]*@[\w.]+\.\w+ 可以把* 看作可选项 实质理解
    • ?元字符

      • 匹配一次或零次 http:// 与 https:// 不能用s* httpsss 所以使用?
      • [\r]? 与我们的\r? 本质是一样的 但是为了清晰直观 我们通常直接[\r]
    • 匹配次数

      • {}也是元字符 举个例子就是之前的RGB #[0-9A-Fa-f]写六遍可以使用{6}
      • 也可以设置一个区间{2.4}
      • []中间是的元字符都是为普通字符,最好写一个\
      • 匹配至少多少次 {3,}类似python
    • 防止过度匹配

      • 使用懒惰版本,进行匹配,前面的匹配都是一个贪婪匹配,例如 * + {n,} 对应的懒惰版本就是加上一个? 例如 * 与 *? 还有 + +? {n,} {n,}?

        这里的懒惰可以理解成就是 尽量的再匹配到第一个的时候就停下来 ,而贪婪就是匹配到最后一个再停下来

    • 位置匹配

      • 指定匹配发生的位置
      • \b 一个标记,用来标记一个单词的开头或者是结尾 理解\b 的实质,实质就是匹配一个可以\w 与一个非字母或者是数字的位置\W 之间的一个位置 b代表boundary 注意我们的这个 \b 只是匹配一个位置 ,而不是匹配一个字符 所以 \bcat\b 得到的字符 还是 3个字符 而非5个
      • 同理 的 \B 来匹配一个你想要的边界 就是 eg night-color \B-\B 可以匹配 但是我们的 color - color 就是无法匹配
      • ^ 这里来再次出现 用作 标记字符串的开始位置 $ 用于标记字符串的结尾
      • 举个例子 匹配一个 XML 文件 因为必须要求 这个声明位于一个文档的最开始 所以我们需要进行 字符串的一个声明 例如 这个 ^\s*<?xml.*?>
  • Post title:正则表达式
  • Post author:Winter
  • Create time:2023-03-25 20:37:20
  • Post link:https://spikeihg.github.io/2023/03/25/正则表达式/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.