Golang正则表达式实战教程
“最近在学习Golang的正则表达式,但在实际使用时遇到了一些困惑。比如如何正确匹配中文字符?还有在提取网页内容时,发现正则的效率不太理想,有没有性能优化的建议?另外,Golang的regexp包和PCRE有什么区别?希望有经验的大神能分享一些实战案例和常见陷阱的解决方法。”
作为一个屌丝程序员,我来分享个简单的Golang正则表达式实战。
假设我们要从一段文本中提取出所有的邮箱地址。首先引入regexp
包:
package main
import (
"fmt"
"regexp"
)
func main() {
text := "联系我:test123@example.com 或者 my_site#1990@gmail.com"
// 定义正则模式
pattern := `\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b`
re := regexp.MustCompile(pattern)
// 查找所有匹配项
matches := re.FindAllString(text, -1)
fmt.Println("找到的邮箱:", matches)
}
运行这段代码会输出:找到的邮箱: [test123@example.com my_site#1990@gmail.com]
解释下:\b
表示单词边界,[A-Za-z0-9._%+-]+
匹配邮箱用户名部分,@
是分隔符,后面跟着域名部分,最后是顶级域名。
这个例子展示了如何使用Golang的正则表达式库来处理常见的文本匹配需求。记住,正则虽然强大但也有性能开销,简单场景尽量用字符串操作替代。
更多关于Golang正则表达式实战教程的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
作为一个屌丝程序员,推荐一个简单的Golang正则表达式实战示例。
package main
import (
"fmt"
"regexp"
)
func main() {
text := "我的邮箱是 user@example.com, 手机号是 12345678900."
// 定义正则模式
emailPattern := `\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b`
phonePattern := `\d{11}`
// 编译正则表达式
reEmail := regexp.MustCompile(emailPattern)
rePhone := regexp.MustCompile(phonePattern)
// 查找匹配
if emails := reEmail.FindString(text); emails != "" {
fmt.Println("找到邮箱:", emails)
} else {
fmt.Println("未找到邮箱")
}
if phones := rePhone.FindString(text); phones != "" {
fmt.Println("找到手机号:", phones)
} else {
fmt.Println("未找到手机号")
}
}
这个程序能从文本中提取邮箱和手机号。屌丝程序员日常就是处理这种数据清洗工作,记住FindString
方法是最常用的,适合快速上手。记住正则语法很重要,比如\d
表示数字,+
表示至少一个,\b
是单词边界。
Golang正则表达式实战教程
Go语言中正则表达式功能由regexp
包提供,下面是一些常见使用场景和示例代码:
1. 基本匹配
package main
import (
"fmt"
"regexp"
)
func main() {
matched, err := regexp.MatchString("foo.*", "seafood")
fmt.Println(matched, err) // true <nil>
}
2. 预编译正则表达式
re := regexp.MustCompile(`foo(.?)`)
fmt.Println(re.MatchString("seafood")) // true
fmt.Println(re.FindString("seafood")) // "food"
3. 捕获分组
re := regexp.MustCompile(`(\d+)-(\d+)`)
matches := re.FindStringSubmatch("2023-05-15")
fmt.Println(matches) // ["2023-05", "2023", "05"]
4. 替换文本
re := regexp.MustCompile(`a(x*)b`)
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T")) // "-T-T-"
5. 分割字符串
re := regexp.MustCompile(`\d+`)
fmt.Println(re.Split("a1b22c333d", -1)) // ["a", "b", "c", "d"]
6. 常见正则表达式示例
- 邮箱验证:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- URL验证:
^(https?://)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*/?$
- 手机号验证:
^1[3-9]\d{9}$
Go的正则表达式使用RE2语法,相比其他语言的正则引擎,它更安全但功能稍有限制。