22.2 正则表达式-数据验证、数据变换

1. 数据验证

正则表达可用于验证文本是否满足某种给定的模式。

正则表达式也是一种语言,因此在使用之前必须先对其进行编译,并将编译结果保存在一个Regexp类型的变量里。以下两个函数即返回该变量的指针。

  • re, err := regexp.Compile("^[a-zA-Z0-9]{5,12}$")
    • 在正则表达式未通过编译时返回错误
  • re := regexp.MustCompile("^[a-zA-Z0-9]{5,12}$")
    • 在正则表达式未通过编译时引发恐慌

Regexp类型的MatchString方法根据其参数字符串与正则表达式是否匹配返回true或者false。当通过Regexp类型变量使用MatchString方法时,仅需提高1个被验证字符串即可,因为正则表达式已提前编译并保存在调用对象内部。

  • fmt.Println(username, "->", re.MatchString(username))

正则表达式已提前编译并保存在re内部,故该方法比regexp.MatchString函数少了一个参数。

Go 复制代码
// 数据验证
// 正则表达可用于验证文本是否满足某种给定的模式
// 正则表达式 = regexp.MustCompile(模式) 
// 验证通过 = 正则表达式.MatchString(被验证文本) 
package main
import (
    "fmt"
    "regexp"
)
func main() {
    usernames := [...]string{
        "slimshady99",
        "!asdf£33£3",
        "roger",
        "iamthebestuseofthisappevaaaar",
    }
	re := regexp.MustCompile(
        "^[a-zA-Z0-9]{5,12}$")

    for _, username := range usernames {
        fmt.Println(username, "->",
            re.MatchString(username))
    }
}
// 打印输出:
 slimshady99 -> true
 !asdf£33£3 -> false	// !
 roger -> true
 iamthebestuseofthisappevaaaar -> false 	// 字符数超过12

2. 数据变换

正则表达可对文本中符合特定模式的内容进行替换。

Regexp类型的ReplaceAllString方法接受两个参数,第一个参数为被替换文本,第二个参数为替换文本。该方法将被替换文本中与调用变量中的正则表达式匹配的部分替换为替换文本。

  • an := regexp.MustCompile("[[:^alnum:]]")
    • 匹配由非(^)英语字母(alphabet)和数字(number)组成的字符集中的任意一个字符。
    • :\^ASCII类名:\] 匹配"ASCII类"外的一个字符,"ASCII类"见附录的说明。

    • 将newUsername中所有既非英语字母亦非数字的字符替换为"x"
    • 例如:!asdf£33£3 -> xasdfx33x3

先根据正则表达式对数据进行评估,检查其中是否含有非法字符。如果含有非法字符,再根据正则表达式将其替换为合法字符------数据清洗管道。

Go 复制代码
// 数据变换
// 正则表达可对文本中符合特定模式的内容进行替换
// 正则表达式 = regexp.MustCompile(模式) 
// 正则表达式.ReplaceAllString(被替换文本, 替换文本) 
package main

import (
    "fmt"
    "regexp"
)

func main() {
    usernames := [...]string{
        "slimshady99",
        "!asdf£33£3",
        "roger",
        "iamthebestuseofthisappevaaaar",
    }

	re := regexp.MustCompile(	//	定义正则表达1
        "^[a-zA-Z0-9]{5,12}$")

    an := regexp.MustCompile("[[:^alnum:]]")//定义用于数据替换的正则表达式2

    for _, username := range usernames {
        newUsername := username
        if len(newUsername) > 12 {	// 首先判断用户名是否符合长度要求
            newUsername = newUsername[:12]	// 不符合的直接截断
        }

        if !re.MatchString(newUsername) { // 检查用户名是否符合正则表达式1要求
            newUsername = an.ReplaceAllString(	// 将所有非法字符替换为x
                newUsername, "x")
        }
        fmt.Println(username, "->", newUsername)
    }
}
// 打印输出:
slimshady99 -> slimshady99
!asdf£33£3 -> xasdfx33x3
roger -> roger
iamthebestuseofthisappevaaaar -> iamthebestus //截断
相关推荐
研究司马懿1 天前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大2 天前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰2 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
长安牧笛2 天前
反传统学习APP,摒弃固定课程顺序,根据用户做题正确性,学习速度,动态调整课程难度,比如某知识点学不会,自动推荐基础讲解和练习题,学习后再进阶,不搞一刀切。
python·编程语言
却尘2 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤2 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
坚果派·白晓明3 天前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
爱思德学术4 天前
中国计算机学会(CCF)推荐学术会议-B(软件工程/系统软件/程序设计语言):ECOOP 2026
编程·编程语言
逝水如流年轻往返染尘4 天前
正则表达式字符串
java·正则表达式