概述
Golang 提供了一个强大且高效的正则表达式库,regexp,它实现了基于正则表达式模式匹配的功能。regexp 库支持编译正则表达式、匹配字符串、查找和替换等操作。
- regexp 的基础知识
regexp 包中的核心类型是 *regexp.Regexp,它表示一个编译后的正则表达式,使用该类型可以进行各种正则操作。主要方法包括:
编译正则表达式
• regexp.Compile(pattern string) (Regexp, error): 编译正则表达式,返回一个正则对象。
• regexp.MustCompile(pattern string) Regexp: 类似于 Compile,但遇到错误会直接 panic。
匹配操作
• MatchString(s string) bool: 检查字符串是否与正则表达式匹配。
• FindString(s string) string: 返回匹配的第一个子串。
• FindAllString(s string, n int) []string: 返回所有匹配的子串,n 指定最多返回的数量(-1 表示全部)。
分组与子匹配
• FindStringSubmatch(s string) []string: 返回匹配的子串及分组内容。
• FindAllStringSubmatch(s string, n int) [][]string: 返回所有匹配的子串及分组内容。
替换操作
• ReplaceAllString(src, repl string) string: 替换所有匹配的子串为指定字符串。
• ReplaceAllStringFunc(src string, repl func(string) string) string: 使用函数动态替换匹配的子串。
其他方法
• Split(s string, n int) []string: 根据正则表达式拆分字符串。
• Match(data []byte) bool: 支持字节切片的匹配。
- 常见正则表达式语法
Golang 的 regexp 库遵循 RE2 语法,常见正则语法包括:
• .: 匹配任意单个字符。
• *: 匹配前面的元素 0 次或多次。
• +: 匹配前面的元素 1 次或多次。
• ?: 匹配前面的元素 0 次或 1 次。
• [abc]: 匹配字符集合中的任意一个字符。
• ^: 匹配字符串的开头。
• $: 匹配字符串的结尾。
• |: 或运算符,表示匹配左右任意一个。
- 实例代码
以下是一个简单的 Golang 程序,涵盖了常见的 regexp 操作:
package main
import (
“fmt”
“regexp”
)
func main() {
// 定义一个正则表达式
pattern := (\w+)@(\w+)\.(\w+)
reg, err := regexp.Compile(pattern)
if err != nil {
fmt.Println(“Error compiling regex:”, err)
return
}
// 测试字符串
text := "Contact us at support@example.com or sales@example.org"
// 1. 判断是否匹配
isMatch := reg.MatchString(text)
fmt.Println("Does the text contain an email address?", isMatch)
// 2. 查找第一个匹配项
firstMatch := reg.FindString(text)
fmt.Println("First match:", firstMatch)
// 3. 查找所有匹配项
allMatches := reg.FindAllString(text, -1)
fmt.Println("All matches:", allMatches)
// 4. 提取分组信息
submatches := reg.FindStringSubmatch(firstMatch)
fmt.Println("Submatches:")
for i, submatch := range submatches {
fmt.Printf("Group %d: %s\n", i, submatch)
}
// 5. 替换操作
replacedText := reg.ReplaceAllString(text, "[REDACTED]")
fmt.Println("Text after replacement:", replacedText)
// 6. 动态替换
dynamicReplace := reg.ReplaceAllStringFunc(text, func(match string) string {
return fmt.Sprintf("[hidden:%s]", match)
})
fmt.Println("Text after dynamic replacement:", dynamicReplace)
// 7. 分割字符串
splitText := reg.Split(text, -1)
fmt.Println("Split text:", splitText)
}
输出结果
Does the text contain an email address? true
First match: support@example.com
All matches: [support@example.com sales@example.org]
Submatches:
Group 0: support@example.com
Group 1: support
Group 2: example
Group 3: com
Text after replacement: Contact us at [REDACTED] or [REDACTED]
Text after dynamic replacement: Contact us at [hidden:support@example.com] or [hidden:sales@example.org]
Split text: [Contact us at or or ]
- 总结
Golang 的 regexp 是一个功能强大的正则表达式库,既支持简单的匹配,也支持复杂的分组、替换和动态操作。通过结合正则表达式语法和 regexp 提供的 API,可以高效地实现各种文本处理任务。