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 = an.ReplaceAllString(newUsername, "x")
    • 将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 //截断
相关推荐
问道飞鱼6 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
我码玄黄13 小时前
正则表达式优化之算法和效率优化
前端·javascript·算法·正则表达式
Java编程乐园19 小时前
Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】
java·正则表达式
好学近乎知o1 天前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
慕城南风1 天前
Go语言中的defer,panic,recover 与错误处理
golang·go
桃园码工2 天前
1-Gin介绍与环境搭建 --[Gin 框架入门精讲与实战案例]
go·gin·环境搭建
云中谷2 天前
Golang 神器!go-decorator 一行注释搞定装饰器,v0.22版本发布
go·敏捷开发
SunnyRivers3 天前
基础爬虫案例实战
正则表达式·爬虫实战·多进程·requests
苏三有春3 天前
五分钟学会如何在GitHub上自动化部署个人博客(hugo框架 + stack主题)
git·go·github
莹雨潇潇3 天前
未来将要被淘汰的编程语言
编程语言