语法规则
字符类匹配表达式
语法 |
说明 |
示例 |
匹配结果 |
一般 |
匹配本身 |
abc |
abc |
. |
匹配任意除换行符"\n"外的字符 |
a.c |
abc |
\ |
转义字符,使后一个字符改变原来的意思 |
a\.c |
a.c |
[...] |
字符集(字符类),对应的位置可以是字符集中任意字符[abc]。也可以给出范围[a-c],第一个字符如果是 ^ 则表示取反,如 [^abc] 表示除了abc之外的其他字符。 |
a[bcd]e |
abe,ace,ade |
\d |
数字:[0-9] |
a\dc |
a1c |
\D |
非数字:[^\d] |
a\Dc |
abc |
\s |
空白字符:[<空格>\t\r\n\f\v] |
a\sc |
a c |
\S |
非空白字符:[^\s] |
a\Sc |
abc |
\w |
单词字符:[A-Za-z0-9] |
a\wc |
abc |
\W |
非单词字符:[^\w] |
a\Wc |
a c |
数量词表达式
语法 |
说明 |
示例 |
匹配结果 |
* |
匹配前一个字符 0 或无限次 |
abc* |
abc,ab,abccc |
+ |
匹配前一个字符 1 次或无限次 |
abc+ |
abc,abcc |
? |
匹配前一个字符 0 次或 1 次 |
abc? |
abc,ab |
{m} |
匹配前一个字符 m 次 |
ab{2}c |
abbc |
{m,n} |
匹配前一个字符 m 至 n 次,m 和 n 可以省略,若省略 m,则匹配 0 至 n 次;若省略 n,则匹配 m 至无限次 |
ab{1,2}c |
abc,abbc |
边界匹配
语法 |
说明 |
示例 |
匹配结果 |
^ |
匹配字符串开头,在多行模式中匹配每一行的开头 |
^abc |
abc |
$ |
匹配字符串末尾,在多行模式中匹配每一行的末尾 |
abc$ |
abc |
\A |
仅匹配字符串开头 |
\Aabc |
abc |
\Z |
仅匹配字符串末尾 |
abc\Z |
abc |
\b |
匹配 \w 和 \W 之间 |
a\b!bc |
a!bc |
\B |
[^\b] |
a\Bbc |
abc |
分组
语法 |
说明 |
示例 |
匹配结果 |
| |
代表左右表达式任意匹配一个,优先匹配左边的表达式 |
abc|def |
abc 或者 def |
(...) |
括起来的表达式将作为分组,分组将作为一个整体,可以后接数量词 |
(abc){2} |
abcabc |
验证
const EmailReg = `^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$`
var EmailRegCompile *regexp.Regexp = regexp.MustCompile(EmailReg)
// MatchString
func IsEmail(email string) bool {
if email != "" {
if isOk, _ := regexp.MatchString(EmailReg, email); isOk {
return true
}
}
return false
}
//Match
func IsEmailV2(email string) bool {
if email != "" {
if isOk, _ := regexp.Match(EmailReg, []byte(email)); isOk {
return true
}
}
return false
}
//MatchReader
func IsEmailV3(email string) bool {
if email != "" {
if isOk, _ := regexp.MatchReader(EmailReg, strings.NewReader(email)); isOk {
return true
}
}
return false
}
//MustCompile
func IsEmailV5(email string) bool {
//return EmailRegComplie.Match([]byte(email))
//return EmailRegComplie.MatchReader(strings.NewReader(email))
return EmailRegCompile.MatchString(email)
}
查找
const NumberReg = `[0-9]*`
var NumberRegCompile *regexp.Regexp = regexp.MustCompile(NumberReg)
const HrefReg = `<a href="(https://so.gushiwen.org/gushi/[a-z]+\.aspx)" target="_blank"[^>]*>([^<]+)</a>`
var HrefRegCompile *regexp.Regexp = regexp.MustCompile(HrefReg)
//FindString|Find : 查找第一个满足条件的值
func FindString(str string) string {
//return string(NumberRegCompile.Find([]byte(str)))
return NumberRegCompile.FindString(str)
}
//FindAllString :查找所有满足条件的值
func FindAll(str string) []string {
return NumberRegCompile.FindAllString(str, -1)
}
//FindAll:查找所有满足条件的值
func FindAllByte(str string) []string {
var strSlice []string
matchs := NumberRegCompile.FindAll([]byte(str), -1)
for _, match := range matchs {
strSlice = append(strSlice, string(match))
}
return strSlice
}
//FindAllStringSubmatch
func FindAllStringSubMatch(str string) [][]string {
return HrefRegCompile.FindAllStringSubmatch(str, -1)
}
替换
const (
NumberReg = `[0-9]*`
StringReg = `[a-z][A-Z]*`
)
var (
NumberRegCompile *regexp.Regexp = regexp.MustCompile(NumberReg)
StringRegCompile *regexp.Regexp = regexp.MustCompile(StringReg)
)
//ReplaceAllString|ReplaceAll :把src满足条件的字串替换为repl
func ReplaceAll(src, repl string) string {
//return NumberRegCompile.ReplaceAllString(src, repl)
return string(NumberRegCompile.ReplaceAll([]byte(src), []byte(repl)))
}
//ReplaceAllStringFunc|ReplaceAllFunc :把src满足条件的字串用函数处理
func ReplaceAllStringFunc(src string) string {
//return string(NumberRegCompile.ReplaceAllFunc([]byte(src), bytes.ToUpper))
return NumberRegCompile.ReplaceAllStringFunc(src, strings.ToUpper)
}
有疑问加站长微信联系(非本文作者)