golang 正则
1. 什么是正则表达式
正则表达式(Regular Expression)是一种用于匹配、查找和替换文本特定模式的字符串。通过使用正则表达式,我们可以方便地从大量文本中提取我们所需要的信息,进行模式匹配、替换或验证操作。
在golang中,正则表达式由正则语法和相关函数组成,可以轻松处理字符串中的匹配和替换操作。
2. 正则表达式基础语法
2.1 字面量字符
正则表达式中的字面量字符是指表示其自身的字符。比如正则表达式abc
表示匹配一个完整的abc
字符串。
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`abc`)
fmt.Println(re.MatchString("abc")) // true
fmt.Println(re.MatchString("def")) // false
}
输出:
true
false
其中,regexp.MustCompile
函数用于编译并返回一个正则表达式。然后,我们可以使用MatchString
函数来检查给定的字符串是否匹配这个正则表达式。
2.2 字符类
字符类(Character Class)用于指定多个字符中的任意一个。使用方括号[]
将多个字符括起来表示一个字符类。
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`[abc]`)
fmt.Println(re.MatchString("a")) // true
fmt.Println(re.MatchString("b")) // true
fmt.Println(re.MatchString("c")) // true
fmt.Println(re.MatchString("d")) // false
fmt.Println(re.MatchString("abc")) // false
}
输出:
true
true
true
false
false
上述代码中,[abc]
表示匹配字符a
、b
或c
。
2.3 范围字符类
范围字符类(Range Character Class)可以表示一个连续范围内的字符。使用连字符-
连接两个字符表示一个范围。
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`[0-9]`)
fmt.Println(re.MatchString("5")) // true
fmt.Println(re.MatchString("9")) // true
fmt.Println(re.MatchString("a")) // false
fmt.Println(re.MatchString("10")) // false
fmt.Println(re.MatchString("a5b")) // true
}
输出:
true
true
false
false
true
上述代码中,[0-9]
表示匹配一个数字字符。
2.4 反向字符类
反向字符类(Negated Character Class)用^
表示,表示任意不在该字符类中的字符。
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`[^0-9]`)
fmt.Println(re.MatchString("a")) // true
fmt.Println(re.MatchString("9")) // false
fmt.Println(re.MatchString("10")) // true
fmt.Println(re.MatchString("a5b")) // true
}
输出:
true
false
true
true
上述代码中,[^0-9]
表示匹配一个非数字字符。
2.5 通配符
通配符(Wildcard)用.
表示,匹配任意字符(除了换行符)。
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`a.b`)
fmt.Println(re.MatchString("aab")) // true
fmt.Println(re.MatchString("acb")) // true
fmt.Println(re.MatchString("abc")) // false
}
输出:
true
true
false
上述代码中,a.b
表示匹配以a
开头和b
结尾的任意3个字符的字符串。
2.6 修饰符
正则表达式中常用的修饰符有i
、m
和s
。
i
(不区分大小写):表示匹配时不区分字符的大小写。m
(多行):表示处理多行文本,^
和$
可以匹配每一行的行头和行尾。s
(单行):表示处理单行文本,.
可以匹配任意字符(包括换行符)。
修饰符可以通过正则表达式的语法进行设置。比如,(?i)
表示设置不区分大小写。
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(?i)abc`)
fmt.Println(re.MatchString("ABC")) // true
fmt.Println(re.MatchString("aBC")) // true
fmt.Println(re.MatchString("Abc")) // true
fmt.Println(re.MatchString("def")) // false
fmt.Println(re.MatchString("aAbc")) // true
fmt.Println(re.MatchString("a\nbc")) // true
}
输出:
true
true
true
false
true
true
上述代码中,(?i)
表示匹配时不区分大小写。
3. 正则表达式函数
在golang中,对正则表达式的操作主要通过regexp
包提供的函数来实现。
3.1 Compile
Compile
函数用于编译一个正则表达式,并返回一个可以用于匹配和查找操作的*Regexp
对象。
func Compile(expr string) (*Regexp, error)
示例:
package main
import (
"fmt"
"regexp"
)
func main() {
re, err := regexp.Compile(`abc`)
if err != nil {
fmt.Println("regexp.Compile error:", err)
return
}
fmt.Println(re.MatchString("abc")) // true
}
输出:
true
3.2 MustCompile
MustCompile
函数与Compile
函数功能相同,但它会直接 panic 报错,而不是返回错误。
func MustCompile(expr string) *Regexp
示例:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`abc`)
fmt.Println(re.MatchString("abc")) // true
}
输出:
true
3.3 MatchString
MatchString
函数用于判断给定的字符串是否匹配正则表达式。
func (re *Regexp) MatchString(s string) bool
示例:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`abc`)
fmt.Println(re.MatchString("abc")) // true
fmt.Println(re.MatchString("def")) // false
}
输出:
true
false
3.4 FindString
FindString
函数用于在给定的字符串中查找第一个匹配的子串,并返回该子串。