Golang正则表达式实战教程

“最近在学习Golang的正则表达式,但在实际使用时遇到了一些困惑。比如如何正确匹配中文字符?还有在提取网页内容时,发现正则的效率不太理想,有没有性能优化的建议?另外,Golang的regexp包和PCRE有什么区别?希望有经验的大神能分享一些实战案例和常见陷阱的解决方法。”

3 回复

作为一个屌丝程序员,我来分享个简单的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语法,相比其他语言的正则引擎,它更安全但功能稍有限制。

回到顶部