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后跟yx|y
表示匹配x或y(优先匹配x)
重复匹配
RE2提供了完整的重复匹配语法:
x*
匹配0次或多次x(贪婪模式)x+
匹配1次或多次x(贪婪模式)x?
匹配0次或1次x(贪婪模式)x{n,m}
匹配n到m次xx{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(其他)
注意事项
-
RE2不支持的特性:
- 反向引用(如
\1
) - 回溯控制(如
(?>re)
) - 条件表达式
- 递归模式
- 反向引用(如
-
性能考虑:
- RE2设计保证线性时间匹配
- 避免过于复杂的嵌套表达式
- 合理使用非捕获组
(?:)
提升性能
-
安全特性:
- 防止正则表达式拒绝服务(ReDoS)攻击
- 限制重复次数(最多1000次)
实用技巧
-
邮箱匹配示例:
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b
-
URL提取:
https?://[^\s/$.?#].[^\s]*
-
日期匹配(YYYY-MM-DD):
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])
掌握RE2的正则表达式语法,可以让你在保证性能和安全性的同时,高效处理各种文本匹配需求。建议从简单模式开始,逐步尝试更复杂的表达式,并充分利用RE2的Unicode支持处理多语言文本。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考