📜  Golang 中的正则表达式是什么?(1)

📅  最后修改于: 2023-12-03 15:31:01.947000             🧑  作者: Mango

Golang 中的正则表达式

正则表达式是一种用来匹配文本的模式。在 Golang 中,可以使用标准库中的正则表达式工具包 regexp 来实现正则表达式的功能。

regexp 包

regexp 包提供了正则表达式的功能,可以用来匹配、替换字符串。regexp 包中主要包含了三个类型:Regexp、RegExpMatch 和 RegExpMatchString。

Regexp

Regexp 类型代表了一个已经成功解析的正则表达式。可以使用 regexp.Compile 函数来将正则表达式字符串解析为 Regexp 类型。例如:

import "regexp"

func main() {
    re := regexp.MustCompile("p([a-z]+)ch") // 解析正则表达式
    fmt.Println(re.MatchString("peach"))   // true
    fmt.Println(re.MatchString("apple"))   // false
}
RegExpMatch

使用 Regexp.FindStringSubmatch 方法可以从输入字符串中查找并提取匹配的子字符串。该方法返回一个 slice,其中第一个元素为整个匹配的字符串,之后每个元素为一个匹配的子串。例如:

re := regexp.MustCompile("p([a-z]+)ch") // 解析正则表达式
fmt.Println(re.FindStringSubmatch("peach")) // [peach ea]
RegExpMatchString

使用 RegexpMatchString 方法可以在输入字符串中查找并提取匹配的子字符串。如果没有匹配到,则返回空字符串。例如:

re := regexp.MustCompile("p([a-z]+)ch") // 解析正则表达式
fmt.Println(re.MatchString("peach")) // true
正则表达式语法

Golang 使用 Perl 兼容的正则表达式语法,以下是一些基本的语法:

  • . 匹配任何字符。
  • [] 匹配括号内的任意一个字符。例如 [aeiou] 将匹配任何一个元音字母。
  • [^] 匹配不在括号内的任意一个字符。例如 [^aeiou] 将匹配任何一个非元音字母。
  • * 匹配前一个字符的零个或多个实例。例如 ab*c 将匹配 "ac""abc""abbc""abbbbc" 等。
  • + 匹配前一个字符的一个或多个实例。例如 ab+c 将匹配 "abc""abbc""abbbbc" 等。但不会匹配 "ac"
  • ? 匹配前一个字符的零个或一个实例。例如 ab?c 将匹配 "ac""abc"
  • | 匹配 | 左右两边的任一个表达式。例如 a(b|c)d 将匹配"abd""acd"
  • () 定义一个子表达式。例如 a(bc)*d 将匹配 adabcdabcbcdabcbbcd 等。
示例

以下是一个简单的例子,展示了 Regexp.FindStringSubmatch 方法的用法:

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(?P<year>\\d{4})-(?P<month>\\d{2})-(?P<day>\\d{2})")
    str := "2022-07-28"
    matches := re.FindStringSubmatch(str)
    for i, name := range re.SubexpNames() {
        if i == 0 {
            continue
        }
        fmt.Printf("%s: %s\n", name, matches[i])
    }
}

输出结果为:

year: 2022
month: 07
day: 28
总结

通过使用 Golang 中的 regexp 包,可以轻松地实现正则表达式的功能,从而完成各种字符串的匹配、替换任务。正则表达式虽然复杂,但是是非常实用的工具,值得程序员们深入学习。