📅  最后修改于: 2023-12-03 15:31:01.947000             🧑  作者: Mango
正则表达式是一种用来匹配文本的模式。在 Golang 中,可以使用标准库中的正则表达式工具包 regexp 来实现正则表达式的功能。
regexp 包提供了正则表达式的功能,可以用来匹配、替换字符串。regexp 包中主要包含了三个类型:Regexp、RegExpMatch 和 RegExpMatchString。
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
}
使用 Regexp.FindStringSubmatch 方法可以从输入字符串中查找并提取匹配的子字符串。该方法返回一个 slice,其中第一个元素为整个匹配的字符串,之后每个元素为一个匹配的子串。例如:
re := regexp.MustCompile("p([a-z]+)ch") // 解析正则表达式
fmt.Println(re.FindStringSubmatch("peach")) // [peach ea]
使用 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
将匹配 ad
、abcd
、abcbcd
、abcbbcd
等。以下是一个简单的例子,展示了 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 包,可以轻松地实现正则表达式的功能,从而完成各种字符串的匹配、替换任务。正则表达式虽然复杂,但是是非常实用的工具,值得程序员们深入学习。