基本语法
正则表达式由不同类型的字符组成,包括普通字符、元字符、分隔符和转义字符等。其中:
-
普通字符:用于匹配文本中出现的相同字符。
-
元字符:用于匹配特定的字符或字符集合。例如.表示匹配任意字符,\d表示匹配数字等。
-
分隔符:用于标记正则表达式的开始和结束,通常为/或者#。
-
转义字符:使用\将有特殊作用的字符(元字符、分隔符等)转义为普通字符。例如.表示匹配半角句号。
符号 | 含义说明 | 示例 | ||
---|---|---|---|---|
. | 匹配任意单个字符(不包括换行) | a.c 能匹配 abc 、axc | ||
^ | 匹配字符串开始 | ^a 匹配以 a 开头的字符串 | ||
$ | 匹配字符串结束 | b$ 匹配以 b 结尾的字符串 | ||
* | 匹配前一个字符 0 次或多次 | ab* 匹配 a , ab , abb | ||
+ | 匹配前一个字符 1 次或多次 | ab+ 匹配 ab , abb ,不匹配 a | ||
? | 匹配前一个字符 0 次或 1 次 | ab? 匹配 a 或 ab | ||
{n} | 恰好匹配 n 次 | a{3} 匹配 aaa | ||
{n,m} | 匹配 n 到 m 次 | a{2,4} 匹配 aa ~aaaa | ||
[] | 字符集,匹配其中任意一个字符 | [abc] 匹配 a 或 b 或 c | ||
[^] | 否定字符集,匹配不在其中的字符 | [^abc] 不匹配 a 、b 、c | ||
\d | 匹配数字,等价于 [0-9] | \d{2} 匹配 2 位数字 | ||
\w | 匹配字母数字下划线,等价于 [A-Za-z0-9_] | \w+ 匹配多个字母或数字 | ||
\s | 匹配空白字符(空格、制表符、换行) | \s+ 匹配一个或多个空格 | ||
` | ` | 或运算符,匹配左右任一规则 | `abc | def` 匹配 abc 或 def |
() | 分组,提取匹配结果或配合 ` | ` 使用 | (ab)+ 匹配 ab 重复出现 |
示例
匹配含有某个关键词的字符串
筛选出包含关键词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所支持的正则表达式以/作为分隔符,因此需要使用转义字符\将其转变为普通字符,即需要在/前增加转义字符\。
匹配手机号码(中国大陆)
^1[3-9]\d{9}$
^ 表示开头;
1 表示第一位必须是 1;
[3-9] 表示第二位是 3 到 9 中的任意一位;
\d{9} 表示后面跟 9 个数字;
$ 表示结尾
提取邮箱
\b[\w.-]+@[\w.-]+\.\w+\b
[\w.-]+ 匹配邮箱前缀(字母、数字、下划线、点、横线);
@ 是邮箱的中间分隔符;
[\w.-]+ 匹配域名;
. 匹配点;
\w+ 匹配顶级域名(如 com、cn)
验证身份证号(18位)
^\d{6}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$
\d{6} 是地址码;
(18|19|20)?\d{2} 是出生年份;
(0[1-9]|1[0-2]) 是月份;
(0[1-9]|[12]\d|3[01]) 是日期;^\d{4}-\d{2}-\d{2}$
\d{3} 是顺序码;
[\dXx] 是校验码,可能是数字或 X/x。
匹配日期
^\d{4}-\d{2}-\d{2}$
\d{4} 年份;
-分隔符;
\d{2} 月份;
再一个 -;
最后 \d{2} 是日期。
例子: 2025-06-05
匹配IPv4 地址
\b(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\b
package main
import (
"fmt"
"regexp"
)
func main() {
text := "有效IP: 192.168.1.1,无效IP: 999.999.999.999,还有一个:10.0.0.255"
// IPv4 匹配正则
pattern := `\b(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\b`
// 编译正则
re := regexp.MustCompile(pattern)
// 查找所有匹配项
matches := re.FindAllString(text, -1)
// 输出结果
for _, match := range matches {
fmt.Println("匹配到的 IP:", match)
}
}
输出
匹配到的 IP: 192.168.1.1
匹配到的 IP: 10.0.0.255
匹配URL
https?://[^\s"'<>]+
https? 匹配 http 或 https;: / / 是协议后缀;
[^\s"'<>]+ 匹配非空格、非引号、非尖括号的字符。
https://www.example.com/path?q=1
匹配HTML
<[^>]+>
匹配中文字符串
:判断是否包含中文、处理文本多语言等
[\u4e00-\u9fa5]
\u4e00-\u9fa5 是常用汉字的 Unicode 范围。
匹配强密码
密码安全校验(至少一个字母、一个数字,6~18位)。
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,18}$
提取文件扩展名
\.\w+$
. 匹配点;
\w+ 匹配多个字母、数字、下划线;
$ 匹配结尾。
hello.jpg → .jpg
练习
在线测试正则表达式
regex.com
正则表达式练习 中文学习网站