Go 编程 | 连载 27 - 正则表达式

2022-09-28 16:13:42 浏览数 (3)

一、Go 中定义正则表达式

很多语言都是支持正则表达式的,Go 也不例外。正则表达式的用途之一就是从字符中查找出与指定正则表达式匹配的字符串子串。

Go 语言的正则表达式是由 regex 表提供的,它提供了实现正则表达式的查找和模式匹配的功能,使用的语法与 Python 相同,可以对字符串和字节进行操作。

匹配字符串需要用到 MatchString 函数,该函数接收两个字符串类型的参数,第一个是正则表达式,第二个是要匹配的字符串;返回一个布尔值表示是否匹配成功,以及一个错误 err。

代码语言:javascript复制
// MatchString 源码
// MatchString reports whether the string s
// contains any match of the regular expression pattern.
// More complicated queries need to use Compile and the full Regexp interface.
func MatchString(pattern string, s string) (matched bool, err error) {
   re, err := Compile(pattern)
   if err != nil {
      return false, err
   }
   return re.MatchString(s), nil
}
代码语言:javascript复制
func main(){

   foods := "Noodle, Chocolate, Pizza"
   favorite := "Chocolate"

   match, err := regexp.MatchString(favorite, foods)

   if err != nil {
      log.Fatal(err)
   }

   fmt.Println(match) // true
}

正则表达式是区分大小写的,如果将 foods 或者 favorite 变量中的 Chocolate 子串改为小写,再次运行后返回的结果为 false,也就是说没有匹配到。

若要在匹配时忽略大小写,可以在正则表达式前面添加 (?i)

代码语言:javascript复制
favorite := "(?i)Chocolate"

上述例子中的正则表表达式比较简单,就是从指定字符串中匹配出一个 "Chocolate" 字段,但是正则表达式在实际应用中会通过很多不同的符号来表示不同字符串或者数字或者特殊字符等。

常见的正则表达式语法:

语法

含义

[ ]

匹配[ ]内的任意一个字符,即任选一个

^

指字符串开始位置的字符或子表达式

$

经常用在表达式的末尾,表示从字符串的末端匹配。如果不用它,则每个正则表达式的实际表达形式都带有.*作为结尾。这个符号可以看成^符号的反义词

|

匹配任意一个有|分隔的部分

?!

不包含。这个组合经常放在字符或者正则表达式前面,表示这些字符不能出现。如果在某整个字符串中全部排除某个字符,就要加上^和$符号

( )

表达式编组,()内的正则表达式会优先运行

{m,n}

匹配前面的字符串或者表达式m~n次,包含m和n次

[^]

匹配任意一个不在中括号内的字符

常用的字符如下:

字符

含义

w

匹配一个字母或数字

D

匹配一位非数字

d

匹配一位数字

*

匹配前面的字符、表达式或括号里的字符0次或多次

匹配前面的字符、表达式或括号里的字符至少一次

?

匹配前面的字符一次或0次

.

匹配任意单个字符,包括数字、空格和符号

转义符,把后面的特殊意义的符号按原样输出

二、使用正则表达式验证数据

正则表达式在用户注册时会频繁使用,比如校验用户名或者密码是否符合规范,邮箱和手机号码是否合规等。

regex 标准库中用于分析正则表达还是的函数有两个,分别是:

  • Compile:在正则表达式未能通过编译时返回错误
  • MustCompile:正则表达式无法编译时引发 panic

推荐使用 MustCompile,出现错误时 panic 终止程序,避免引发更大的错误。

代码语言:javascript复制
func main(){
   // 用户名必须由 5至12 位的大写小写字母以及数字组成
   pattern := "^[a-zA-Z0-9]{5,12}"
   re := regexp.MustCompile(pattern)

   fmt.Println(re.MatchString("tony"))  // false, 位数不够
   fmt.Println(re.MatchString("Tony123")) // true
   fmt.Println(re.MatchString("tony&steve123")) // false,包含特殊字符
}

1 人点赞