22.1 正则表达式-定义正则表达式、正则语法

1.定义正则表达式

正则表达式意在描述隐藏在数据中的某种模式或规则。

  • 例如:下面的几个字符串看似各不相同:
    • slimshady999
    • roger
    • 1813Wagner
  • 但看似不同的数据却隐藏着相同的特征:
    • 仅由英语字母和数字组成
    • 英语字母有小写也有大写
    • 总字符数介于 5到12之间
  • 这些共同特征可以用正则表达式来描述:
    • ^a-zA-Z0-9{5,12}$

正则表达式犹如一门微型语言,通过特定的语法规则,描述字符数据的模式。

利用正则表达式可以很方便地完成以下任务:

  • 数据搜索
    • 在文本集合中搜索符合特定模式规则的子集
  • 数据验证
    • 验证某个文本输入是否符合给定的模式规则
  • 数据变换
    • 将文本集中符合给定模式规则的元素替换掉

Go语言标准库的regexp包对正则表达式提供支持,其中的MatchString函数接受一个正则表达式和一个被搜索字符串,返回值为bool值,用于描述该字符串中是否存在与正则表达式所描述的模式相匹配的部分。

  • match, err := regexp.MatchString(needle, haystack)
Go 复制代码
// 大海捞针
// regexp包的MatchString函数接受一个正则表达式模式和一个被搜索
// 字符串,返回该字符串中是否存在与正则表达式模式相匹配的部分
package main
import (
    "fmt"
    "log"
    "regexp"
)
func main() {
    //needle := "chocolate"
    needle := "(?i)chocolate"	// (?i)表示忽略大小写
    haystack := "Chocolate is my favorite!"
    match, err := regexp.MatchString(needle, haystack)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(match)
}
// 打印输出:
true

2.正则表达式语法

正则表达式作为一种模式描述语言,有其特定的语法,例如:

|-------|--------------|
| 语法标记 | 匹配规则 |
| . | 匹配换行符之前的任何字符 |
| * | 匹配0到多个任意字符 |
| ^ | 开头 |
| $ | 结尾 |
| + | 匹配1到多次 |
| ? | 匹配0到1次 |
| \[\] | 匹配字符集内的任意字符 |
| {n} | 匹配n次 |
| {n,} | 匹配n到多次 |
| {m,n} | 匹配m到n次 |

基于特定匹配语法所构造出的模式描述字符串即正则表达式。

假设在将用户设置的用户名插入数据库之前需要先验证其合法性,规则如下:

  • 用户名的长度至少5个字符但不得超过12个字符
  • 用户名只能由英语字母和阿拉伯数字组成,不能含有其它特殊符号和非英语字符
  • 构成用户名的英语字母可以使用小写也可以使用大写

根据匹配语法得到描述上述规则的正则表达式:^a-zA-Z0-9{5,12}$

  • "^"和"$"表示从字符串的第一个字符开始匹配,一直匹配到最后一个字符。
  • "a-zA-Z0-9"内的字符集表示与其中任意一个字符匹配,包括大小写英语字母和数字。
  • "{5,12}"内的数值区间表示至少匹配5次,但最多不超过12次。

可以想象不使用正则表达式完成这样的匹配验证并非不可能,但要复杂得多。

相关推荐
林壮Allen12 小时前
用 Go 从零实现多 Agent 协作框架:两个让我踩坑的设计问题
go·ai编程
小白快快跑哦16 小时前
python-字符串全解(六):正则表达式-修饰符
python·正则表达式·修饰符
代码方舟18 小时前
Go数据工程:利用天远柠檬查出险优化二手车批发拍卖车源出险核查合规体验
人工智能·go
不是万能的豆学长18 小时前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
用户1257585243618 小时前
Golang后台管理框架推荐:XYGo Admin与devinggo怎么选?
后端·go·ai编程
tachibana220 小时前
Go语言里slice是怎么扩容的?
后端·golang·go·切片
11路没有终点21 小时前
正则表达式(Regex)通用学习文档
正则表达式
小白快快跑哦1 天前
python-字符串全解(六):正则表达式-分组
python·mysql·正则表达式·分组
tachibana21 天前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
临床数据科学和人工智能兴趣组1 天前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy