如何书写正则表达式

本文主要对正则表达式的一些匹配规则进行了介绍。

说明

仅支持RE2 语法,这一语法与 PCRE 略有不同。请注意,默认情况下,正则表达式区分大小写,查看更多参考内容

仅匹配精确短语

用法示例

匹配短语

stock tips

Regex 示例

示例 1:(\W|^)stock\stips(\W|$)

示例 2:(\W|^)stock\s{0,3}tips(\W|$)

示例 3:(\W|^)stock\s{0,3}tip(s){0,1}(\W|$)

注释

  • \W 匹配字母、数字或下划线以外的任何字符。它不允许 regex 匹配短语前后的字符。

  • 在示例 2 中,\s 匹配空格字符,{0,3} 表示字词stocktip之间可以出现 0-3 个空格。

  • ^ 匹配新行的行首,允许 regex 匹配出现在行首的短语(该短语前无其他字符)。

  • $ 匹配行尾,允许 regex 匹配出现在行尾的短语(该短语后无其他字符)。

  • 在示例 3 中,(s) 匹配字母s,{0,1} 表示该字母可以在字词 tip 后出现0次或1次。所以,该正则表达式会匹配stock tipstock tips。另外,您还可以使用字符 ? 来替代 {0,1}。

匹配列表中的字词或短语

用法示例

匹配以下列表中的任意字词或短语:

  • baloney

  • darn

  • drat

  • fooey

  • gosh darnit

  • heck

Regex 示例

(?i)(\W|^)(baloney|darn|drat|fooey|gosh\sdarnit|heck)(\W|$)

注释

  • (…) 会对所有字词分组,以便 \W 字符类可应用于括号内的所有字词。

  • (?i) 使匹配内容时不区分大小写。

  • \W 匹配字母、数字或下划线以外的任何字符。它不允许regex匹配列表中的字词或短语前后的字符。

  • ^ 匹配新行的行首,允许 regex 匹配出现在行首的字词(该字词前无其他字符)。

  • $ 匹配行尾,允许 regex 匹配出现在行尾的字词(该字词后无其他字符)。

  • | 代表“或”,所以,此 regex 会匹配列表中的任意一个字词。

  • \s 匹配一个空格字符。使用此字符可分隔短语中的字词。

匹配包含不同拼写或特殊字符的字词

用法示例

匹配字词“viagra”和垃圾邮件发件人使用的某些内容,例如:

  • vi@gra

  • v1agra

  • v1@gra

  • v!@gr@

Regex 示例

v[i!1][a@]gr[a@]

注释

  • 未添加 \W,因此viagra的任何变体前后都可能出现其他字符。例如,该正则表达式仍匹配以下文本中的viagra

    viagra!!***viagra***

  • [i!1] 匹配该字词中位于第二个字符位置的字符i!1

匹配某个特定网域的所有电子邮件地址

用法示例

匹配来自网域yahoo.comhotmail.comgmail.com的任何电子邮件地址。

Regex 示例

(\W|^)[\w.\-]{0,25}@(yahoo|hotmail|gmail)\.com(\W|$)

注释

  • \W 匹配字母、数字或下划线以外的任何字符。它不允许 regex 匹配电子邮件地址前后的字符。

  • ^ 匹配新行的行首,允许 regex 匹配出现在行首的地址(该地址前无其他字符)。

  • $ 匹配行尾,允许正则表达式匹配出现在行尾的地址(该地址后无其他字符)。

  • [\w.\-] 匹配所有字词字符(a-z、A-Z、0-9 或下划线)、句号或连字符。这些是电子邮件地址的第一部分中所包含的最常用有效字符。请注意,\-(代表连字符)必须在方括号内字符列表的最后出现。

  • 短划线和句号前的 \ 用于“去除”这些字符,即表示短划线和句号本身不是 regex 的特殊字符。请注意,方括号中不需要去除句号。

  • {0,25} 代表可以在 @ 符号之前出现的前字符集中的字符数,范围从 0-25。“内容合规性”电子邮件设置最多可以对正则表达式中的每个字符集匹配 25 个字符。

匹配某个范围内的所有 IP 地址

用法示例

匹配范围192.168.1.0192.168.1.255之间的所有 IP 地址

Regex 示例

示例 1:192\.168\.1\.

示例 2:192\.168\.1\.\d{1,3}

注释

  • 每个句号前的 \ 用于“去除”句号,即表示句号本身不是 regex 的特殊字符。

  • 在示例 1 中,最后一个句号之后没有其他字符,所以,正则表达式匹配以192.168.1.开头的所有 IP 地址,无论后面出现什么数字。

  • 在示例 2 中,\d 会匹配最后一个句号之后从09的所有数字,{1,3} 表示最后一个句号之后可以出现 1-3 位数。在这种情况下,正则表达式匹配以192.168.1.开头的所有完整 IP 地址。注意,该正则表达式还会匹配无效的 IP 地址,如192.168.1.999

  • (…) 格式对网域进行分组,分隔网域的 | 字符代表“或”。

匹配字母数字格式

用法示例

匹配公司的采购订单号。此编号可能有各种格式,例如:

  • PO nn-nnnnn

  • PO-nn-nnnn

  • PO# nn nnnn

  • PO#nn-nnnn

  • PO nnnnnn

Regex 示例

(\W|^)po[#\-]{0,1}\s{0,1}\d{2}[\s-]{0,1}\d{4}(\W|$)

注释

  • \W 匹配字母、数字或下划线以外的任何字符。它不允许 regex 匹配编号前后的字符。

  • ^ 匹配新行的行首,允许 regex 匹配出现在行首的编号(该编号前无其他字符)。

  • $ 匹配行尾,允许 regex 匹配出现在行尾的编号(该编号后无其他字符)。

  • [#\-] 匹配字母 po 后的井号或连字符,{0,1} 表示这些字符中每个字符可以出现 0 次或 1 次。请注意,\-(代表连字符)必须在方括号内字符列表的最后出现。

  • \s 匹配空格,{0,1} 表示空格可出现 0 次或 1 次。

  • \d 匹配从 0-9 的任意数字,{2} 表示在编号的这一位置必须正好出现 2 位数字。