Go语言中的正则表达式:文本处理的强大工具
正则表达式是基于模式搜索、提取和替换文本的必备工具。在Go语言(Golang)中,对正则表达式的支持通过标准库 regexp 包实现。该包提供了一种快速且安全的方式来处理模式,其语法与Perl和RE2类似。本文将通过实际示例,介绍该包的主要功能。
1. regexp 包基础操作
regexp 包遵循“一次编译,多次使用”的原则。这能提高重复应用同一模式时的性能。主要函数:
regexp.Compile(expr)— 编译正则表达式。返回*Regexp和一个错误。regexp.MustCompile(expr)— 功能同上,但在出错时会引发 panic。便于初始化全局变量。regexp.MatchString(expr, s)— 检查字符串s中是否至少包含一个与模式匹配的内容。
package main
import ( "fmt" "regexp")
func main() { // 简单检查:字符串是否包含数字? matched, _ := regexp.MatchString(`\\d+`, "订单编号12345") fmt.Println(matched) // true
// 编译模式以便重复使用 re := regexp.MustCompile(`[a-z]+`) fmt.Println(re.MatchString("hello")) // true fmt.Println(re.MatchString("HELLO")) // false}注意:默认情况下,MatchString 搜索部分匹配(类似于 strings.Contains)。若要使字符串完全匹配模式,请使用锚点 ^ 和 $。
2. 搜索与提取数据
要查找所有匹配项或第一个匹配项,请使用 FindString、FindAllString、FindStringSubmatch 方法及其字节切片对应的版本。
2.1. 查找第一个匹配项
re := regexp.MustCompile(`\\b\\w+@\\w+\\.\\w+\\b`)email := re.FindString("联系我们:support@example.com 或 info@test.org")fmt.Println(email) // support@example.com2.2. 查找所有匹配项
re := regexp.MustCompile(`\\d{4}`)numbers := re.FindAllString("验证码:1234, 5678, 9012", -1)fmt.Println(numbers) // [1234 5678 9012]FindAllString 的第二个参数是最大匹配次数。-1 表示“全部”。
2.3. 捕获组(子匹配)
捕获组允许提取匹配结果的特定部分。它们通过圆括号 () 定义。
re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`)match := re.FindStringSubmatch("user@example.com")fmt.Println(match) // [user@example.com user example.com]// match[0] — 完整匹配// match[1] — 第一组 (user)// match[2] — 第二组 (example.com)3. 使用正则表达式进行文本替换
regexp 包提供了两个主要的替换方法:
ReplaceAllString(src, repl)— 使用字符串repl替换所有匹配项。ReplaceAllStringFunc(src, replFunc)— 使用回调函数依次替换每个匹配项。
3.1. 简单替换
re := regexp.MustCompile(`\\s+`)result := re.ReplaceAllString("很多 空格 在这里", " ")fmt.Println(result) // "很多 空格 在这里"3.2. 使用捕获组进行替换
在替换字符串中,可以使用 $1、$2 等引用捕获组。
re := regexp.MustCompile(`(\\w+)\\s+(\\w+)`)result := re.ReplaceAllString("张 三", "$2, $1")