正则表达式在Go字符串处理中的实战应用代码
前言
在 Go 语言的字符串处理领域,正则表达式是功能强大的工具,能够实现复杂的文本匹配、查找、替换等操作。虽然初次接触正则表达式时,其语法可能显得复杂,但掌握之后,它能极大地提升文本处理效率。接下来,我们通过实际案例深入探讨正则表达式在 Go 字符串处理中的应用。
一、Go 语言中的正则表达式库
Go 语言通过regexp包支持正则表达式操作。使用前,需要导入该包:
import "regexp"
regexp包提供了编译正则表达式、匹配字符串、查找子串、替换字符串等功能。
二、基本匹配
(一)简单字符匹配
假设要判断一个字符串是否包含特定单词,如 "hello"。示例代码如下:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "hello, world"
match, _ := regexp.MatchString("hello", str)
if match {
fmt.Println("字符串包含hello")
} else {
fmt.Println("字符串不包含hello")
}
}
这里使用regexp.MatchString函数,它接收两个参数:正则表达式和要匹配的字符串。如果字符串中包含与正则表达式匹配的子串,返回true,否则返回false。
(二)字符类匹配
正则表达式中的字符类可以匹配一组字符中的任意一个。例如,要匹配一个数字,可以使用[0-9]。示例如下:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "age: 25"
match, _ := regexp.MatchString("[0-9]", str)
if match {
fmt.Println("字符串包含数字")
} else {
fmt.Println("字符串不包含数字")
}
}
[0-9]表示匹配 0 到 9 之间的任意一个数字字符。
三、查找子串
(一)查找所有匹配项
使用regexp.Regexp类型的FindAllString方法可以查找字符串中所有匹配正则表达式的子串。例如,要查找字符串中的所有数字:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "prices: $10, $20, $30"
re := regexp.MustCompile("[0-9]+")
matches := re.FindAllString(str, -1)
fmt.Println(matches) // 输出: [10 20 30]
}
regexp.MustCompile用于编译正则表达式,如果编译失败会导致程序崩溃,适用于已知正则表达式正确的情况。FindAllString的第二个参数-1表示返回所有匹配项。
(二)查找并提取分组
正则表达式中的分组可以用于提取匹配字符串的特定部分。例如,要从邮箱地址中提取用户名和域名:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "user@example.com"
re := regexp.MustCompile(`([a-zA-Z0-9_.+-]+)@([a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)`)
matches := re.FindStringSubmatch(str)
if len(matches) > 0 {
fmt.Println("用户名:", matches[1])
fmt.Println("域名:", matches[2])
}
}
([a-zA-Z0-9_.+-]+)和([a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)是两个分组,FindStringSubmatch会返回包含所有匹配项及分组内容的切片。
四、替换字符串
使用regexp.Regexp类型的ReplaceAllString方法可以将匹配正则表达式的子串替换为指定字符串。例如,将字符串中的所有数字替换为 "#":
package main
import (
"fmt"
"regexp"
)
func main() {
str := "prices: $10, $20, $30"
re := regexp.MustCompile("[0-9]+")
newStr := re.ReplaceAllString(str, "#")
fmt.Println(newStr) // 输出: prices: $#, $#, $#
}
五、复杂案例:验证电话号码格式
假设要验证电话号码格式,以中国手机号码为例,其格式通常为 11 位数字,且以 1 开头。示例代码如下:
package main
import (
"fmt"
"regexp"
)
func main() {
phoneNumber := "13800138000"
re := regexp.MustCompile(`^1[3-9]\d{9}$`)
match := re.MatchString(phoneNumber)
if match {
fmt.Println("电话号码格式正确")
} else {
fmt.Println("电话号码格式错误")
}
}
^表示字符串开头,$表示字符串结尾,1[3-9]\d{9}表示以 1 开头,第二位是 3 到 9 中的一个数字,后面跟着 9 个任意数字。
六、总结
正则表达式在 Go 字符串处理中应用广泛,从简单的字符匹配到复杂的文本提取、替换和验证,都能发挥重要作用。通过合理使用regexp包提供的函数和方法,结合具体业务需求编写正则表达式,能高效解决各种字符串处理问题。在实际应用中,需要不断练习和积累经验,才能熟练运用正则表达式 。
附:go语言 正则表达式 获取网页标签内的数据 示例
package main
import(
"regexp"
"fmt"
"io/ioutil"
)
func main() {
//读取文件
f,err := ioutil.ReadFile("./spider-page/regexp-1A0001.html")
if err != nil {
fmt.Print(err)
}
str := string(f)
//获取 <h1>标题内的文字
reg := regexp.MustCompile(`<strong>(?s:(.*?))</strong>(.*)`)
text := reg.FindAllStringSubmatch(str, -1)
fmt.Printf("%s-%s\n",text[0][1],text[0][2]) // 上证指数-1A0001
}
获取今天最低价格
reg = regexp.MustCompile(`<strong id="tlowprice">(?s:(.*?))</strong>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("最低价:%s\n",text[0][1]) // 最低价:2533.36
获取今天最高价格
reg = regexp.MustCompile(`<strong id="thighprice">(?s:(.*?))</strong>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("最高价:%s\n",text[0][1]) // 最高价:2554.79
获取当前时间
reg = regexp.MustCompile(`<span class="price" id="hexm_curPrice">(?s:(.*?))</span>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("当前价:%s\n",text[0][1]) // 当前价:2553.83
获取当前价格
reg = regexp.MustCompile(`<p id="timeshow">(?s:(.*?))</p>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("当前时间:%s\n",text[0][1]) // 当前时间:2019年1月12日 15:00:00
返回结果
上证指数-1A0001
最低价:2533.36
最高价:2554.79
当前价:2553.83
当前时间:2019年1月12日 15:00:00
到此这篇关于正则表达式在Go字符串处理中实战应用的文章就介绍到这了,更多相关Go字符串正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Go在GoLand中引用github.com中的第三方包具体步骤
这篇文章主要给大家介绍了关于Go在GoLand中引用github.com中第三方包的具体步骤,文中通过图文介绍的非常详细,对大家学习或者使用Go具有一定的参考价值,需要的朋友可以参考下2024-01-01


最新评论