Go语言的正则表达式
正则表达式基础
正则表达式是一种用于匹配字符串中字符组合的模式。在Go语言中,正则表达式由regexp包提供支持。
基本使用
创建正则表达式
使用regexp.Compile函数创建正则表达式:
package main import ( "fmt" "regexp" ) func main() { r, err := regexp.Compile("ab+") if err != nil { fmt.Println("Error compiling regex:", err) return } fmt.Println("Regex compiled successfully") }匹配字符串
使用MatchString方法检查字符串是否匹配正则表达式:
package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile("ab+") fmt.Println(r.MatchString("ab")) // true fmt.Println(r.MatchString("abb")) // true fmt.Println(r.MatchString("a")) // false fmt.Println(r.MatchString("abc")) // true }常用方法
FindString
查找第一个匹配的字符串:
package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile("ab+") fmt.Println(r.FindString("xabby")) // ab }FindStringSubmatch
查找第一个匹配的字符串及其子匹配:
package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile("a(b+)") fmt.Println(r.FindStringSubmatch("xabby")) // ["abb" "bb"] }FindAllString
查找所有匹配的字符串:
package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile("ab+") fmt.Println(r.FindAllString("abbbcab", -1)) // ["abbb" "ab"] }正则表达式语法
Go语言的正则表达式语法与Perl兼容,主要包括:
.匹配任意字符(除了换行符)*匹配前面的表达式0次或多次+匹配前面的表达式1次或多次?匹配前面的表达式0次或1次^匹配字符串的开始$匹配字符串的结束[]匹配方括号内的任意一个字符()捕获分组
示例:邮箱验证
package main import ( "fmt" "regexp" ) func main() { emailRegex := regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`) emails := []string{ "user@example.com", "invalid-email", "user.name@example.co.uk", } for _, email := range emails { fmt.Printf("%s: %t\n", email, emailRegex.MatchString(email)) } }示例:URL提取
package main import ( "fmt" "regexp" ) func main() { urlRegex := regexp.MustCompile(`https?://[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?`) text := "Visit https://golang.org and http://example.com for more information." urls := urlRegex.FindAllString(text, -1) fmt.Println(urls) // ["https://golang.org" "http://example.com"] }性能优化
- 使用
regexp.MustCompile预编译正则表达式,避免重复编译 - 对于简单的字符串操作,考虑使用
strings包而不是正则表达式 - 对于复杂的正则表达式,考虑使用更具体的模式以提高性能
总结
正则表达式是处理字符串的强大工具,Go语言的regexp包提供了全面的支持。通过合理使用正则表达式,可以简化字符串处理逻辑,提高代码的可读性和维护性。