正则表达式是一种强大的文本匹配工具,可以用于在文本中查找特定的模式。本文将提供简单且实用的正则表达式快速上手教程,帮助您快速掌握其基本用法。
本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。
如果您对正则表达式不够熟悉,可以使用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的日志。.*
用于匹配任意字符,直到该行日志结束。