正则表达式在Go字符串处理中的实战应用代码

 更新时间:2026年03月06日 10:02:08   作者:普通网友  
在Go语言中,正则表达式与字符串处理是强大的工具,能够大幅提升文本处理效率,下面这篇文章主要介绍了正则表达式在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中编写测试代码的方法总结

    在Go中编写测试代码的方法总结

    在程序开发过程中,测试是非常重要的一环,甚至有一种开发模式叫 TDD,先编写测试,再编写功能代码,通过测试来推动整个开发的进行,可见测试在开发中的重要程度,为此,Go提供了testing框架来方便我们编写测试,本文将向大家介绍在Go中如何编写测试代码
    2023-07-07
  • Go 语言sort 中的sortInts 方法

    Go 语言sort 中的sortInts 方法

    这篇文章主要介绍了Go 语言sort 中的sortInts 方法,Go 的 sort 包实现了内置和用户定义类型的排序。我们将首先查看内置函数的排序,西瓦嗯更多相关资料需要的小伙伴可以参考一下
    2022-04-04
  • Golang开发动态库的实现

    Golang开发动态库的实现

    这篇文章主要介绍了Golang开发动态库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Go在GoLand中引用github.com中的第三方包具体步骤

    Go在GoLand中引用github.com中的第三方包具体步骤

    这篇文章主要给大家介绍了关于Go在GoLand中引用github.com中第三方包的具体步骤,文中通过图文介绍的非常详细,对大家学习或者使用Go具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • golang基于errgroup实现并发调用的方法

    golang基于errgroup实现并发调用的方法

    这篇文章主要介绍了golang基于errgroup实现并发调用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 浅析Go语言bitset的实现原理

    浅析Go语言bitset的实现原理

    bitset包是一个将非负整数映射到布尔值的位的集合,这篇文章主要通过开源包bitset来为大家分析一下位集合的设计和实现,感兴趣的可以学习一下
    2023-08-08
  • 使用Golang获取音视频时长信息的示例代码

    使用Golang获取音视频时长信息的示例代码

    这篇文章主要介绍了如何使用Golang获取音视频时长信息,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • Go语言接口的用法详解

    Go语言接口的用法详解

    本文详细讲解了Go语言接口的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • go build失败报方法undefined的解决过程

    go build失败报方法undefined的解决过程

    go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包,下面这篇文章主要给大家介绍了关于go build失败报方法undefined的解决过程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Go语言通过反射实现获取各种类型变量的值

    Go语言通过反射实现获取各种类型变量的值

    反射是程序在运行期间获取变量的类型和值、或者执行变量的方法的能力,这篇文章主要为大家讲讲Go语言通过反射获取各种类型变量值的方法,需要的可以参考下
    2023-07-07

最新评论