当前位置: 首页 > news >正文

golang中的星号*通配符字符串模式匹配 和问号? 通配符字符串模式匹配的2种实现方法 和相关的单元测试用例

在go语言中,我们如果需要对字符串进行星号* 或者问号? 模式匹配, 可以有2种方法实现 通配符 * 问号 ? 匹配, 找出给定的输入字符串str是否与pattern字符串模式相匹配。

模式匹配函数使用文档参考 strutils package - github.com/tekintian/strutils - Go Packages

下面分别对这2种实现方式进行说明

1. 正则实现* ?通配符模式匹配

  通过将字符串中的* ?通配符转换为对应的正则后利用正则表达式进行字符串匹配,实现代码如下:


// 星号模式匹配* 和问号模式匹配 ,将模式匹配字符串转换为正则后使用正则进行匹配
// @author: tekintian@gmail.com
// @see https://dev.tekin.cn
// @docs 使用文档 https://pkg.go.dev/github.com/tekintian/strutils#IsWmMatchingReg
func IsWmMatchingReg(str, pattern string) bool {// 模式匹配符 *, ? 转换为正则表达式, *替换为 (.*?), .需要进行转义为 \. ; 问号?转换为 (.?)rp := strings.NewReplacer("*", `(.*?)`, ".", `\.`, "?", `(.?)`)reg := rp.Replace(pattern) // 将v转换为正则表达式// 如果正则中不包含前后限定符,则添加上if !strings.HasPrefix(reg, "^") && !strings.HasSuffix(reg, "$") {reg = fmt.Sprintf(`^%s$`, reg) // 在正则中增加前后限定符}// 正则对象获取regex, err := GetRegexp(reg)if err != nil {return false}// 正则匹配return regex.MatchString(str)
}

详细使用文档和示例代码参考 strutils package - github.com/tekintian/strutils - Go Packages 

2. 使用二维矩阵matrix方式实现模式匹配

通过创建一个二维矩阵matrix,其中matrix[i][j] 如果输入字符串中的第一个i字符与模式中的第一个j字符匹配,则为真。 这种方式效果和第一种正则的方式是一样的,只不过代码稍微复杂了一些。

func IsWmMatching(str string, pattern string) bool {rstrs := []rune(str)rpats := []rune(pattern)lenInput := len(rstrs)lenPattern := len(rpats)// 创建一个二维矩阵matrix,其中matrix[i][j] 如果输入字符串中的第一个i字符与模式中的第一个j字符匹配,则为真。matrix := make([][]bool, lenInput+1)for i := range matrix {matrix[i] = make([]bool, lenPattern+1)}matrix[0][0] = truefor i := 1; i < lenInput; i++ {matrix[i][0] = false}if lenPattern > 0 {if rpats[0] == '*' {matrix[0][1] = true}}for j := 2; j <= lenPattern; j++ {if rpats[j-1] == '*' {matrix[0][j] = matrix[0][j-1]}}for i := 1; i <= lenInput; i++ {for j := 1; j <= lenPattern; j++ {if rpats[j-1] == '*' {matrix[i][j] = matrix[i-1][j] || matrix[i][j-1]}if rpats[j-1] == '?' || rstrs[i-1] == rpats[j-1] {matrix[i][j] = matrix[i-1][j-1]}}}return matrix[lenInput][lenPattern]
}

单元测试用例


func TestIsWmMatchingReg(t *testing.T) {testCases := []struct {str     stringpattern stringret     bool}{{str: "https://www.tekin.cn", pattern: "*.tekin.cn", ret: true},{str: "dev.tekin.cn", pattern: "www.tekin.cn", ret: false},{str: "dev.tekin.cx", pattern: "dev.tekin.c?", ret: true},{str: "dev.tekin.cxxyy", pattern: "dev.tekin.c?", ret: false},}for _, v := range testCases {// ret := strutils.IsWmMatching(v.str, v.pattern)ret := strutils.IsWmMatchingReg(v.str, v.pattern)if ret != v.ret {t.Fatalf("failed to match %v, expected %v, got %v", v.str, v.ret, ret)}}}

总结:字符串的通配符* ?模式匹配的重点关注于对字符串的模式/格式进行验证,可以应用在对字符串的模式进行验证的场景,如CORS中的origin安全验证等场景,我们可以通过通配符来批量对允许的origin进行设置和验证,从而可以规避CORS的通配符和访问认证的相关问题。

CORS参考 http跨域网络请求中的CORS(跨源资源共享) 那些事 -- HTTP跨域请求, chrome插件跨域请求使用详解, origin格式,origin通配符等-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SQL Zoo 6.The JOIN operation
  • 【c++】类和对象 (中) (类的默认成员函数)
  • Springboot 实现 Modbus Rtu 协议接入物联网设备
  • matlab实现红绿灯识别
  • MySQL事务隔离级别、InnoDB使用MVCC+各种锁实现了RC和RR事务隔离级别、具体案例
  • cpio 命令
  • element-ui周选择器,如何获取年、周、起止日期?
  • C# Type 对象序列化与反序列化
  • 合并两个有序数组(LeetCode)
  • oracle创建dblink使得数据库A能够访问数据库B表LMEAS_MFG_FM的数据
  • sql获取过去的小时数
  • vue请求springboot接口下载zip文件
  • 【书生大模型实战营第三期 | 入门岛第3关-Git 基础知识】
  • java并发包AtomicInteger类
  • PHP之docker学习笔记
  • Create React App 使用
  • Facebook AccountKit 接入的坑点
  • JAVA并发编程--1.基础概念
  • mongodb--安装和初步使用教程
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • vuex 笔记整理
  • 开发基于以太坊智能合约的DApp
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 手机端车牌号码键盘的vue组件
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 新版博客前端前瞻
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 走向全栈之MongoDB的使用
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #include到底该写在哪
  • #图像处理
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (1)虚拟机的安装与使用,linux系统安装
  • (3)(3.5) 遥测无线电区域条例
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (LeetCode) T14. Longest Common Prefix
  • (pytorch进阶之路)扩散概率模型
  • (rabbitmq的高级特性)消息可靠性
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计ssm电影分享网站
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (转)母版页和相对路径
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .net经典笔试题
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • /etc/shadow字段详解
  • /etc/sudoer文件配置简析
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • []sim300 GPRS数据收发程序
  • [001-03-007].第07节:Redis中的事务