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 //截断
相关推荐
jjjxxxhhh1236 小时前
正则表达式在过滤交换机lldp信息的应用举例
正则表达式
_Soy_Milk10 小时前
后端学习路线
java·学习·go
happy_king_zi15 小时前
Goland的使用
ide·编辑器·go
软糖工程0011 天前
正则表达式【详细解读】
大数据·前端·爬虫·python·学习·正则表达式·数据分析
IT杨秀才2 天前
Go语言的Context妙用
后端·go
一雨方知深秋2 天前
新建flask项目,配置入口文件,启动项目
javascript·python·正则表达式·flask·json·html5
卡布达ovo2 天前
正则表达式和re模块
正则表达式
I'm happy2 天前
pyhton语法 正则表达式
python·正则表达式
LabVIEW开发2 天前
通过 LabVIEW 正则表达式读取数值(整数或小数)
正则表达式·labview·数字·开发技巧
夏河始溢2 天前
一七零、GORM值为0或者空字符串的时候不能被更新&创建的五种解决办法
linux·服务器·数据库·go