正则表达式是一种强大的文本匹配工具,可以用于在文本中查找特定的模式。本文将提供简单且实用的正则表达式快速上手教程,帮助您快速掌握其基本用法。
本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。
如果您对正则表达式不够熟悉,可以使用Regex101等工具进行练习和调试。这些工具支持直观展示正则表达式和文本的匹配过程。本文以Regex101为例,介绍各个示例。
基本语法
正则表达式由不同类型的字符组成,包括普通字符、元字符、分隔符和转义字符等。其中:
- 普通字符:用于匹配文本中出现的相同字符。 
- 元字符:用于匹配特定的字符或字符集合。例如 - .表示匹配任意字符,- \d表示匹配数字等。
- 分隔符:用于标记正则表达式的开始和结束,通常为 - /或者- #。
- 转义字符:使用 - \将有特殊作用的字符(元字符、分隔符等)转义为普通字符。例如- \.表示匹配半角句号。
如下图所示,Regex101工具默认在正则表达式a.\d\.前添加了分隔符/。其中,a表示匹配字母a,.表示匹配一个任意字符,\d表示匹配一个任意数字,\.表示匹配半角句号。
下表罗列了常用的特殊字符及其含义。
在不同的编程语言和正则表达式引擎中,支持的符号和语法可能有所差异。在实际编程中,需要结合具体的语言和工具了解其支持的正则表达式语法。
| 符号 | 含义 | 
| 
 | 匹配任意一个字符,除了换行符。 | 
| 
 | 匹配任意一个数字字符,等价于[0-9]。 | 
| 
 | 匹配除数字字符之外的任意字符,等价于[^0-9]。 | 
| 
 | 匹配任意一个字母、数字或下划线字符,等价于[A-Za-z0-9_]。 | 
| 
 | 匹配除字母、数字和下划线字符之外的任意字符,等价于[^A-Za-z0-9_]。 | 
| 
 | 匹配任意一个空白字符,包括空格、制表符、换行符等。 | 
| 
 | 匹配除空白字符之外的任意字符。 | 
| 
 | 匹配单词边界,即单词字符和非单词字符的交界处。 | 
| 
 | 匹配非单词边界。 | 
| 
 | 匹配前面的字符0次或多次。 | 
| 
 | 匹配前面的字符1次或多次。 | 
| 
 | 匹配前面的字符0次或1次。 | 
| 
 | 将两个匹配逻辑进行或运算。 | 
| 
 | 匹配前面的字符n次。 | 
| 
 | 匹配前面的字符至少n次。 | 
| 
 | 匹配前面的字符至少n次,但不超过m次。 | 
| 
 | 匹配字符集中的任意一个字符。 | 
| 
 | 匹配除字符集中的字符之外的任意字符。 | 
| 
 | 匹配字符串的开头。 | 
| 
 | 匹配字符串的结尾。 | 
| 
 | 分组,将括号内的一组字符看作一个整体。 | 
| 
 | 常用分隔符,用于标记正则表达式的开头和结尾。 | 
| 
 | 转义字符,使用 | 
示例
示例一:匹配含有某个关键词的字符串
筛选出包含关键词05/Jan/2023的日志。
- 日志样例:Info 05/Jan/2023 Warning、Info 06/Jan/2023 Error 
- 正则表达式: - .*05\/Jan\/2023.*- .*表示匹配任意零个或多个字符,即- 05/Jan/2023前后可以有任意字符。
- 05\/Jan\/2023表示匹配关键词- 05/Jan/2023。- 因为Logtail所支持的正则表达式以 - /作为分隔符,因此需要使用转义字符- \将其转变为普通字符,即需要在- /前增加转义字符- \。
 

示例二:匹配手机号码
筛选出包含以111或222开头的11位手机号码的日志。
- 样例:11144445555、22266667777、33388889999 
- 正则表达式: - (111|222)\d{8}- 手机号码前三位是运营商号码,中间四位是地区编码,后四位则是任意数字。假设运营商号码只有111和222,地区编码为任意数字。 - (111|222)表示一个分组,包含了两个可能的值,即111或222。
- \d表示匹配一个数字。
- {8}表示前面的- \d需要匹配8次,即匹配8个数字。
 

示例三:匹配一个完整字符串
筛选出格式为[时间] [级别] [模块] [信息]的日志,其中时间为yyyy-mm-dd hh:mm:ss格式,级别包括DEBUG、INFO、WARN和ERROR,模块和信息为任意的字符串。
- 日志样例:[2021-09-23 10:23:45] [INFO] [user login] [user login success] 
- 正则表达式: - ^\[\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\] \[(DEBUG|INFO|WARN|ERROR)\] \[.+\] \[.+\]$- \[、- \]表示匹配- []字符,因为- []在正则语法中有特殊含义,因此需要添加转义字符- \。
- \[\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\]表示匹配日期和时间。
- \[(DEBUG|INFO|WARN|ERROR)\]表示匹配各个日志级别。
- \[.+\] \[.+\]$表示匹配任意的非空字符串。
 

示例四:匹配不以某关键词开头的字符串
筛选出不以DEBUG开头的日志。
- 日志样例:DEBUG: test debug、INFO: test info 
- 正则表达式: - ^(?!DEBUG).*- ^表示字符串的开始位置,即DEBUG是处于字符串的开头位置。
- (?!DEBUG)表示排除包含DEBUG的日志。- (?!DEBUG)为正向否定预查,格式为- (?!<pattern>),其中- <pattern>为需要排除的内容。
- .*表示匹配任意字符,直到该行日志结束。
 

示例五:匹配不包含关键词的字符串
筛选出不包含INFO或DEBUG的日志。
- 日志样例:hello world、INFO、ERROR message、DEBUG、warning log、error INFO、debug detail、info status 
- 正则表达式: - ^(?!.*(INFO|DEBUG)).*- ^表示字符串的开始位置,即INFO或DEBUG是处于字符串的开头位置。
- (?!.*(INFO|DEBUG))表示排除包含INFO或DEBUG的日志。
- .*用于匹配任意字符,直到该行日志结束。
 
