Skip to content

1. 正则表达式基础 ​

正则表达式(Regular Expressions,简称 Regex)是描述字符串模式的语法,用来在文本里查找、替换、校验。Go 里由 regexp 包提供,Python、JavaScript、Java 的库长得也差不多。

1.1 正则表达式概述 ​

定义

  • 一条正则描述一类字符串,匹配上就能取出来、换掉或校验格式。

应用场景

  • 搜索与替换:在文本中查找匹配的模式并进行替换。
  • 数据验证:检查用户输入是否符合特定格式(如电子邮件地址、电话号码)。
  • 信息提取:从文本中提取特定的信息(如从日志文件中提取 IP 地址)。

工具与库

  • 具体到 Go,就是 regexp 包,用的 RE2 引擎。

1.2 正则表达式的基本语法 ​

1. 字符类(Character Classes)

  • .:匹配任意单个字符(除了换行符)。
    • 例如:a.b 匹配 a 后面跟着任意字符再跟着 b,如 a1b 或 a_b。
  • \d:匹配任意数字,等价于 [0-9]。
    • 例如:\d{3} 匹配 3 位数字,如 123。
  • \D:匹配任意非数字字符。
    • 例如:\D 匹配 a、@、# 等非数字字符。
  • \w:匹配任意字母数字字符及下划线,等价于 [a-zA-Z0-9_]。
    • 例如:\w+ 匹配一个或多个字母、数字或下划线。
  • \W:匹配任意非字母数字字符及下划线。
    • 例如:\W 匹配 !、@、# 等非字母数字字符。
  • \s:匹配任意空白字符(如空格、制表符)。
    • 例如:\s+ 匹配一个或多个空白字符。
  • \S:匹配任意非空白字符。
    • 例如:\S 匹配 a、1、_ 等非空白字符。

2. 字符集(Character Sets)

  • [abc]:匹配字符 a、b 或 c。
    • 例如:[a-c] 匹配 a、b 或 c。
  • [^abc]:匹配任何不在字符集中的字符。
    • 例如:[^a-c] 匹配除 a、b 和 c 外的任何字符。
  • [a-z]:匹配从 a 到 z 的任意小写字母。
    • 例如:[a-z] 匹配任何小写字母。
  • [0-9]:匹配任意数字字符。
    • 例如:[0-9] 匹配任何数字字符。

3. 元字符(Metacharacters)

  • ^:匹配字符串的开头。
    • 例如:^Hello 匹配以 Hello 开头的字符串。
  • $:匹配字符串的结尾。
    • 例如:world$ 匹配以 world 结尾的字符串。
  • *:匹配前面的字符零次或多次。
    • 例如:a* 匹配零个或多个 a,如 aa、a 或空字符串。
  • +:匹配前面的字符一次或多次。
    • 例如:a+ 匹配一个或多个 a,如 a、aa。
  • ?:匹配前面的字符零次或一次,或表示非贪婪匹配。
    • 例如:a? 匹配零个或一个 a,如 a 或空字符串。
  • {n}:匹配前面的字符正好 n 次。
    • 例如:a{3} 匹配 aaa。
  • {n,}:匹配前面的字符至少 n 次。
    • 例如:a{2,} 匹配两个或更多的 a,如 aa、aaa。
  • {n,m}:匹配前面的字符至少 n 次,最多 m 次。
    • 例如:a{2,4} 匹配 2 到 4 个 a,如 aa、aaa、aaaa。

4. 分组与捕获(Grouping and Capturing)

  • ():用于分组匹配,捕获匹配的子串。
    • 例如:(ab)+ 匹配 ab、abab、ababab。
  • (?:):用于分组但不捕获。
    • 例如:(?:ab)+ 匹配 ab、abab、ababab,但不捕获 ab。
  • \1, \2, ...:引用捕获组。
    • 注意:Go 标准库 regexp 使用 RE2 引擎,不支持反向引用,模式 (\d)\1 会报错 invalid escape sequence。如需匹配重复数字,只能匹配两个相同类别的字符或借助代码逻辑判断。

5. 选择(Alternation)

  • a|b:匹配 a 或 b。
    • 例如:cat|dog 匹配 cat 或 dog。

6. 转义字符(Escaping Characters)

  • \:用来转义特殊字符,使其被当作普通字符处理。
    • 例如:\. 匹配句点字符 .,\* 匹配星号字符 *。

1.3 常见的正则表达式符号与用法 ​

1. 匹配电子邮件地址

regexp
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 匹配一个标准的电子邮件地址。

2. 匹配 IP 地址(IPv4)

regexp
^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)$
  • 匹配一个有效的 IPv4 地址。

3. 匹配电话号码

regexp
^\+?[1-9]\d{1,14}$
  • 匹配国际电话号码格式(E.164)。

4. 匹配日期(YYYY-MM-DD)

regexp
^\d{4}-\d{2}-\d{2}$
  • 匹配日期格式如 2024-08-02。

5. 匹配 URL

regexp
https?:\/\/[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(\/\S*)?
  • 匹配 http 或 https 的 URL。

这些模式可以直接丢给 Go 的 regexp 包;注意 RE2 不支持反向引用,重复匹配这类需求要另想办法。

参考资料 ​

同层页面 ​

相关页面 ​

Hello Golang