Jartap Jartap
首页
  • 正则表达式
  • 字符匹配基础
  • 量词与重复匹配
  • 分组与引用
  • 各语言正则表达式用法概览

正则表达式

正则表达式(Regular Expression,简称Regex)是一种描述文本模式的符号化语言,用于在字符串中高效地匹配、搜索、替换或提取符合特定规则的文本内容。

不同的正则表达式引擎支持的语法和功能不同,总结起来可以分为三类:BRE(Basic Regular Expression基础正则表达式)、ERE(Extend Regular扩展正则表达式)、PCRE(Perl Compatible Regular Expressions Perl 兼容正则表达式)

关于BRE、ERE、PCRE有一些常见的问题:

  1. “ERE 是 BRE 的超集”
    • 部分正确:ERE 支持 BRE 的所有功能,但语法不同(如 \+ vs +)。
    • 例外:BRE 的 \| 在 ERE 中是字面 |,需用 | 表示或。
  2. “PCRE 是唯一支持高级功能的引擎”
    • 不完全正确:其他引擎(如 Java 的 java.util.regex)也支持类似功能,但语法不同。
  3. “所有工具都支持 PCRE”
    • 错误:sed、grep 默认不支持,需特定版本或选项(如 grep -P)。

强烈推荐一个网站: https://regex101.com,不仅可以进行验证表达式匹配问题,还可以进行表达式引擎支持功能查询


核心功能

  1. 匹配:判断字符串是否符合某种模式(如验证邮箱格式)。
  2. 搜索:在文本中定位符合模式的子串(如提取日志中的IP地址)。
  3. 替换:批量修改符合模式的文本(如清理HTML标签)。
  4. 提取:从结构化/非结构化文本中提取关键信息(如解析JSON中的字段)。

核心语法

  1. 字符匹配:
    • . 匹配任意单个字符(如 a.b 匹配 acb、a1b)。
    • [abc] 匹配字符组中的任意一个(如 [0-9] 匹配数字)。
  2. 量词控制:
    • * 匹配前一个字符0次或多次(如 a* 匹配 ""、a、aaa)。
    • + 匹配1次或多次,? 匹配0次或1次(如 a+b? 匹配 a、ab、aaa)。
  3. 边界与分组:
    • ^ 和 $ 分别匹配字符串开头和结尾(如 ^hello$ 仅匹配完整字符串 hello)。
    • () 用于分组,\1、\2 可引用捕获的分组(如 (\d{3})-\1 匹配 123-123)。

应用场景

  1. 数据验证:
    • 邮箱格式:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    • 密码强度:^(?=.*[A-Z])(?=.*\d).{8,}$(至少8位,含大写字母和数字)
  2. 文本处理:
    • 清理多余空格:\s+ → (将多个空格替换为单个空格)。
    • 提取日期:(\d{4})-(\d{2})-(\d{2})(捕获年、月、日)。
  3. 工具集成:
    • 编辑器(VS Code):批量替换代码中的重复模式。
    • 命令行(grep/sed):日志分析、文件搜索。

为什么需要正则表达式?

  • 效率:一行正则可能替代数百行循环代码。
  • 灵活性:适应动态变化的文本模式。
  • 跨语言:Python、JavaScript、Java等主流语言均支持。

总结:正则表达式是文本处理的“瑞士军刀”,掌握它能让开发者在处理字符串时事半功倍!