RE2正则表达式语法完全指南

RE2正则表达式语法完全指南

re2 RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library. re2 项目地址: https://gitcode.com/gh_mirrors/re21/re2

正则表达式是文本处理中不可或缺的强大工具,而RE2作为Google开发的正则表达式引擎,以其安全性和高性能著称。本文将全面解析RE2支持的正则表达式语法,帮助开发者掌握这一重要工具。

基础语法结构

单字符匹配

RE2提供了多种匹配单个字符的方式:

  • . 匹配任意字符(默认不包括换行符,设置s标志后包括)
  • [abc] 匹配字符a、b或c
  • [^abc] 匹配除a、b、c外的任意字符
  • \d 匹配数字(等价于[0-9]
  • \D 匹配非数字字符

字符类扩展

RE2支持丰富的字符类表示法:

  • Unicode字符类:\p{Greek}匹配希腊字母,\P{Greek}匹配非希腊字母
  • ASCII字符类:[[:alpha:]]匹配字母,[[:^alpha:]]匹配非字母
  • 简写形式:\pN(单字母Unicode类别)

组合与重复

表达式组合

  • xy 表示x后跟y
  • x|y 表示匹配x或y(优先匹配x)

重复匹配

RE2提供了完整的重复匹配语法:

  • x* 匹配0次或多次x(贪婪模式)
  • x+ 匹配1次或多次x(贪婪模式)
  • x? 匹配0次或1次x(贪婪模式)
  • x{n,m} 匹配n到m次x
  • x{n} 精确匹配n次x

非贪婪版本(在量词后加?):

  • x*? 匹配0次或多次x(非贪婪)
  • x+? 匹配1次或多次x(非贪婪)

注意:RE2限制重复次数最大为1000次,但无限重复不受此限制。

分组与标志

分组语法

  • (re) 编号捕获组
  • (?P<name>re) 命名捕获组(也可写作(?<name>re)
  • (?:re) 非捕获组
  • (?flags:re) 设置标志的非捕获组

模式标志

RE2支持以下标志(可通过(?flags)语法设置):

  • i 不区分大小写
  • m 多行模式(影响^和$的行为)
  • s 使.匹配换行符
  • U 非贪婪模式(交换?的行为)

标志语法示例:(?im-s)开启i和m,关闭s

边界匹配

RE2提供多种边界匹配方式:

  • ^ 文本开始或行首(m标志下)
  • $ 文本结束或行尾(m标志下)
  • \A 文本绝对开始
  • \z 文本绝对结束
  • \b ASCII单词边界
  • \B 非ASCII单词边界

转义序列

RE2支持的标准转义序列:

  • \n 换行符
  • \t 制表符
  • \x7F 十六进制字符
  • \x{10FFFF} Unicode字符
  • \Q...\E 字面量文本(忽略元字符)

特殊转义:

  • \C 匹配单个字节(即使UTF-8模式)
  • \123 八进制字符

字符类详解

字符类元素

字符类[...]内可包含:

  • 单个字符:a
  • 范围:a-z
  • 字符类:\d[:alpha:]
  • Unicode属性:\p{Lu}(大写字母)

预定义字符类

Perl风格(仅ASCII)

  • \w 单词字符([A-Za-z0-9_]
  • \W 非单词字符
  • \s 空白字符
  • \S 非空白字符

ASCII字符类

  • [[:alnum:]] 字母数字
  • [[:xdigit:]] 十六进制数字
  • [[:space:]] 空白字符

Unicode支持

RE2对Unicode有良好支持:

  • \p{Sc} 匹配所有货币符号
  • \p{Lu} 匹配所有大写字母
  • \p{Z} 匹配所有分隔符

Unicode一般类别包括:

  • L(字母)
  • N(数字)
  • P(标点)
  • S(符号)
  • Z(分隔符)
  • C(其他)

注意事项

  1. RE2不支持的特性:

    • 反向引用(如\1
    • 回溯控制(如(?>re)
    • 条件表达式
    • 递归模式
  2. 性能考虑:

    • RE2设计保证线性时间匹配
    • 避免过于复杂的嵌套表达式
    • 合理使用非捕获组(?:)提升性能
  3. 安全特性:

    • 防止正则表达式拒绝服务(ReDoS)攻击
    • 限制重复次数(最多1000次)

实用技巧

  1. 邮箱匹配示例:

    \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b
    
  2. URL提取:

    https?://[^\s/$.?#].[^\s]*
    
  3. 日期匹配(YYYY-MM-DD):

    \d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])
    

掌握RE2的正则表达式语法,可以让你在保证性能和安全性的同时,高效处理各种文本匹配需求。建议从简单模式开始,逐步尝试更复杂的表达式,并充分利用RE2的Unicode支持处理多语言文本。

re2 RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library. re2 项目地址: https://gitcode.com/gh_mirrors/re21/re2

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姚蔚桑Dominique

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值