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

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

一、Go 中定义正则表达式

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

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

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

// 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
}
复制代码
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)

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

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

常见的正则表达式语法:

语法 含义
[ ] 匹配[ ]内的任意一个字符,即任选一个
指字符串开始位置的字符或子表达式
$ 经常用在表达式的末尾,表示从字符串的末端匹配。如果不用它,则每个正则表达式的实际表达形式都带有.*作为结尾。这个符号可以看成^符号的反义词
| 匹配任意一个有|分隔的部分
?! 不包含。这个组合经常放在字符或者正则表达式前面,表示这些字符不能出现。如果在某整个字符串中全部排除某个字符,就要加上^和$符号
( ) 表达式编组,()内的正则表达式会优先运行
{m,n} 匹配前面的字符串或者表达式m~n次,包含m和n次
[^] 匹配任意一个不在中括号内的字符

常用的字符如下:

字符 含义
\w 匹配一个字母或数字
\D 匹配一位非数字
\d 匹配一位数字
* 匹配前面的字符、表达式或括号里的字符0次或多次
+ 匹配前面的字符、表达式或括号里的字符至少一次
? 匹配前面的字符一次或0次
. 匹配任意单个字符,包括数字、空格和符号
\ 转义符,把后面的特殊意义的符号按原样输出

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

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

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

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

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

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,包含特殊字符
}



相关文章
|
12天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
30 7
|
17天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
25天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
47 7
|
1月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
1月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化
|
2月前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
2月前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
2月前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
2月前
|
存储 安全 编译器
go语言编程系列(六)
go语言编程系列(六)
|
2月前
|
自然语言处理 Java 测试技术
go语言编程系列(二)
go语言编程系列(二)

相关实验场景

更多
下一篇
无影云桌面