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函数少了一个参数。

// 数据验证
// 正则表达可用于验证文本是否满足某种给定的模式
// 正则表达式 = 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

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

// 数据变换
// 正则表达可对文本中符合特定模式的内容进行替换
// 正则表达式 = 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. 22.2 表达式-数据验证数据变换

    2024-06-17 07:04:02       27 阅读
  2. MySQL数据库——17.表达式

    2024-06-17 07:04:02       34 阅读
  3. jQuery 表达式 验证表单

    2024-06-17 07:04:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 07:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 07:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 07:04:02       82 阅读
  4. Python语言-面向对象

    2024-06-17 07:04:02       91 阅读

热门阅读

  1. golang实现循环队列

    2024-06-17 07:04:02       28 阅读
  2. github基础使用

    2024-06-17 07:04:02       28 阅读
  3. QSharedMemory使用详解

    2024-06-17 07:04:02       27 阅读
  4. Qt 实战(4)信号与槽 | 4.3、信号连接信号

    2024-06-17 07:04:02       28 阅读
  5. 跨域资源共享(CORS)问题与解决方案

    2024-06-17 07:04:02       28 阅读
  6. wxml与标准的html的异同?

    2024-06-17 07:04:02       30 阅读
  7. 3.1. 马氏链-马氏链的定义和示例

    2024-06-17 07:04:02       27 阅读
  8. Android基础-JNI

    2024-06-17 07:04:02       24 阅读
  9. 一个简单的UDP客户端和服务端的完整C++示例

    2024-06-17 07:04:02       37 阅读
  10. 学习vite的核心原理

    2024-06-17 07:04:02       27 阅读
  11. Flutter学习(一)

    2024-06-17 07:04:02       30 阅读
  12. 【websocket】怎么终止websocket断开重连

    2024-06-17 07:04:02       30 阅读
  13. 【Git】撤销远程仓库的提交(push)

    2024-06-17 07:04:02       38 阅读