正则表达式入门教程

正则表达式是一种强大的文本匹配工具,可以用于在文本中查找特定的模式。本文将提供简单且实用的正则表达式快速上手教程,帮助您快速掌握其基本用法。​

重要

本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

如果您对正则表达式不够熟悉,可以使用Regex101等工具进行练习和调试。这些工具支持直观展示正则表达式和文本的匹配过程。本文以Regex101为例,介绍各个示例。

基本语法

正则表达式由不同类型的字符组成,包括普通字符、元字符、分隔符和转义字符等。其中:

  • 普通字符:用于匹配文本中出现的相同字符。

  • 元字符:用于匹配特定的字符或字符集合。例如.表示匹配任意字符,\d表示匹配数字等。

  • 分隔符:用于标记正则表达式的开始和结束,通常为/或者#

  • 转义字符:使用\将有特殊作用的字符(元字符、分隔符等)转义为普通字符。例如\.表示匹配半角句号。

如下图所示,Regex101工具默认在正则表达式a.\d\.前添加了分隔符/。其中,a表示匹配字母a,.表示匹配一个任意字符,\d表示匹配一个任意数字,\.表示匹配半角句号。image.png

下表罗列了常用的特殊字符及其含义。

重要

在不同的编程语言和正则表达式引擎中,支持的符号和语法可能有所差异。在实际编程中,需要结合具体的语言和工具了解其支持的正则表达式语法。

符号

含义

.

匹配任意一个字符,除了换行符。

\d

匹配任意一个数字字符,等价于[0-9]。

\D

匹配除数字字符之外的任意字符,等价于[^0-9]。

\w

匹配任意一个字母、数字或下划线字符,等价于[A-Za-z0-9_]。

\W

匹配除字母、数字和下划线字符之外的任意字符,等价于[^A-Za-z0-9_]。

\s

匹配任意一个空白字符,包括空格、制表符、换行符等。

\S

匹配除空白字符之外的任意字符。

\b

匹配单词边界,即单词字符和非单词字符的交界处。

\B

匹配非单词边界。

*

匹配前面的字符0次或多次。

+

匹配前面的字符1次或多次。

?

匹配前面的字符0次或1次。

|

将两个匹配逻辑进行或运算。

{n}

匹配前面的字符n次。

{n,}

匹配前面的字符至少n次。

{n,m}

匹配前面的字符至少n次,但不超过m次。

[abc]

匹配字符集中的任意一个字符。

[^abc]

匹配除字符集中的字符之外的任意字符。

^

匹配字符串的开头。

$

匹配字符串的结尾。

()

分组,将括号内的一组字符看作一个整体。

/

常用分隔符,用于标记正则表达式的开头和结尾。

\

转义字符,使用\将有特殊作用的字符(元字符、分隔符等)转义为普通字符。

示例

示例一:匹配含有某个关键词的字符串

筛选出包含关键词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所支持的正则表达式以/作为分隔符,因此需要使用转义字符\将其转变为普通字符,即需要在/前增加转义字符\

image.png

示例二:匹配手机号码

筛选出包含以111或222开头的11位手机号码的日志。

  • 样例:11144445555、22266667777、33388889999

  • 正则表达式:(111|222)\d{8}

    手机号码前三位是运营商号码,中间四位是地区编码,后四位则是任意数字。假设运营商号码只有111和222,地区编码为任意数字。

    • (111|222)表示一个分组,包含了两个可能的值,即111或222。

    • \d表示匹配一个数字。

    • {8}表示前面的\d需要匹配8次,即匹配8个数字。

image.png

示例三:匹配一个完整字符串

筛选出格式为[时间] [级别] [模块] [信息]的日志,其中时间为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)\]表示匹配各个日志级别。

    • \[.+\] \[.+\]$表示匹配任意的非空字符串。

image.png

示例四:匹配不以某关键词开头的字符串

筛选出不以DEBUG开头的日志。

  • 日志样例:DEBUG: test debug、INFO: test info

  • 正则表达式:^(?!DEBUG).*

    • ^表示字符串的开始位置,即DEBUG是处于字符串的开头位置。

    • (?!DEBUG)表示排除包含DEBUG的日志。(?!DEBUG)为正向否定预查,格式为(?!<pattern>),其中<pattern>为需要排除的内容。

    • .*表示匹配任意字符,直到该行日志结束。

image.png

示例五:匹配不包含关键词的字符串

筛选出不包含INFO或DEBUG的日志。

  • 日志样例:hello world、INFO、ERROR message、DEBUG、warning log、error INFO、debug detail、info status

  • 正则表达式:^(?!.*(INFO|DEBUG)).*

    • ^表示字符串的开始位置,即INFO或DEBUG是处于字符串的开头位置。

    • (?!.*(INFO|DEBUG))表示排除包含INFO或DEBUG的日志。

    • .*用于匹配任意字符,直到该行日志结束。

image.png

参考链接