Go 语言入门学习之正则表达式

2022-04-28 11:01:59
目录
前言什么是正则表达式MatchString 函数Compile 函数MustCompile 函数FindAllString 函数FindAllStringIndex 函数Split 函数Go 正则表达式捕获组正则表达式替换字符串ReplaceAllStringFunc 函数总结

前言

在计算中,我们经常需要将特定模式的字符或字符子集匹配为另一个字符串中的字符串。此技术用于使用特别的语法来搜索给定字符串中的特定字符集。

如果搜索到的模式匹配,或者在目标字符串中找到给定的子集,则搜索被称为成功;否则被认为是不成功的。

什么是正则表达式

正则表达式(或 RegEx)是一个特殊的字符序列,它定义了用于匹配特定文本的搜索模式。在 golang 中,有一个内置的正则表达式包: ​​regexp​​ 包,其中包含所有操作列表,如过滤、修改、替换、验证或提取。

正则表达式可以用于文本搜索和更高级的文本操作。正则表达式内置于 grep 和 sed 等工具,vi 和 emacs 等文本编辑器,Go、java 和 python 等编程语言中。表达式的语法主要遵循这些流行语言中使用的已建立的 RE2 语法。 RE2 语法是 PCRE 的一个子集,有各种注意事项。

MatchString 函数

​MatchString()​​ 函数报告作为参数传递的字符串是否包含正则表达式模式的任何匹配项。

package mainimport ("fmt""log""regexp")func main() {words := [...]string{"Seven", "even", "Maven", "Amen", "eleven"}for _, word := range words {found, err := regexp.MatchString(".even", word)if err != nil {log.Fatal(err)}if found {fmt.Printf("%s matchesn", word)} else {fmt.Printf("%s does not matchn", word)}}}

运行该代码:

(",s*")

正则表达式包括一个逗号字符和任意数量的相邻空格。

vals := re.Split(data, -1)

我们得到了值的一部分。

for _, val := range vals {n, err := strconv.Atoi(val)sum += nif err != nil {log.Fatal(err)}}

我们遍历切片并计算总和。切片包含字符串;因此,我们使用 ​​strconv.Atoi​​ 函数将每个字符串转换为整数。

运行代码:

189

Go 正则表达式捕获组

圆括号 () 用于创建捕获组。这允许我们将量词应用于整个组或将交替限制为正则表达式的一部分。为了找到捕获组(Go 使用术语子表达式),我们使用 ​​FindStringSubmatch​​ 函数。

package mainimport ("fmt""regexp")func main() {websites := [...]string{"webcode.me", "zetcode.com", "freebsd.org", "netbsd.org"}re := regexp.MustCompile("(w+).(w+)")for _, website := range websites {parts := re.FindStringSubmatch(website)for i, _ := range parts {fmt.Println(parts[i])}fmt.Println("---------------------")}}

在代码示例中,我们使用组将域名分为两部分。

re := regexp.MustCompile("(w+).(w+)")

我们用括号定义了两个组。

parts := re.FindStringSubmatch(website)

​FindStringSubmatch​​ 返回包含匹配项的字符串切片,包括来自捕获组的字符串。

运行代码:

$ go run capturegroups.go
webcode.me
webcode
me
---------------------
zetcode.com
zetcode
com
---------------------
freebsd.org
freebsd
org
---------------------
netbsd.org
netbsd
org
---------------------

正则表达式替换字符串

可以用 ​​ReplaceAllString​​ 替换字符串。该方法返回修改后的字符串。

package mainimport ("fmt""io/ioutil""log""net/http""regexp""strings")func main() {resp, err := http.Get("http://webcode.me")if err != nil {log.Fatal(err)}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {log.Fatal(err)}content := string(body)re := regexp.MustCompile("<[^>]*>")replaced := re.ReplaceAllString(content, "")fmt.Println(strings.TrimSpace(replaced))}

该示例读取网页的 HTML 数据并使用正则表达式去除其 HTML 标记。

resp, err := http.Get("http://webcode.me")

我们使用 http 包中的 Get 函数创建一个 GET 请求。

body, err := ioutil.ReadAll(resp.Body)

我们读取响应对象的主体。

re := regexp.MustCompile("<[^>]*>")

这个模式定义了一个匹配 HTML 标签的正则表达式。

replaced := re.ReplaceAllString(content, "")

我们使用 ReplaceAllString 方法删除所有标签。

ReplaceAllStringFunc 函数

​ReplaceAllStringFunc​​ 返回一个字符串的副本,其中正则表达式的所有匹配项都已替换为指定函数的返回值。

package mainimport ("fmt""regexp""strings")func main() {content := "an old eagle"re := regexp.MustCompile(`[^aeiou]`)fmt.Println(re.ReplaceAllStringFunc(content, strings.ToUpper))}

在代码示例中,我们将 ​​strings.ToUpper​​ 函数应用于字符串的所有字符。

$ go run replaceallfunc.goaN oLD eaGLe

总结

模式匹配在根据基于正则表达式和语法的特定搜索模式在字符串中搜索某些字符集时起着重要作用。

匹配的模式允许我们从字符串中提取所需的数据并以我们喜欢的方式对其进行操作。理解和使用正则表达式是处理文本的关键。

在实践中,程序员会保留一组常用的正则表达式来匹配电子邮件、电话号码等,并在需要时使用和重用它。