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

devtools/2024/10/16 0:18:10/

在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博客


http://www.ppmy.cn/devtools/90652.html

相关文章

【微信小程序实战教程】之微信小程序中的 JavaScript

微信小程序中的 JavaScript 微信小程序的业务逻辑都是通过JavaScript语言来实现的&#xff0c;本章我们将详细的讲解JavaScript的基本概念&#xff0c;以及在小程序中如何使用JavaScript语言。JavaScript是一种轻量的、解释型的、面向对象的头等函数语言&#xff0c;是一种动态…

提示工程:CO-STAR框架

在人工智能领域&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;的应用中&#xff0c;提示工程已成为一项至关重要的技能。它不仅需要对技术有深刻的理解&#xff0c;还需要创造力和战略思维的结合。本文将探讨提示工程的重要性&#xff0c;详细介绍CO-STAR框架的使…

hashmap底层原理(数据结构 put原理 get原理 remove原理)

目录 一、数据结构 二、put原理 进入put方法 第一步&#xff1a;通过 HashMap 自己提供的hash 算法算出当前 key 的hash 值 第二步&#xff1a; 进入putVal(hash(key), key, value, false, true) 第三步&#xff1a; resize 完整源码 putval resize 流程图​ 三、get原…

【大数据】探索大数据基础知识:定义、特征与生态系统

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

掌握Conda配置:使用conda config --user命令

掌握Conda配置&#xff1a;使用conda config --user命令 Conda作为Python和其他科学计算语言的包管理器&#xff0c;其灵活性和强大功能在很大程度上依赖于其配置系统。conda config --user命令允许用户管理用户级别的配置&#xff0c;这使得Conda的设置可以针对单个用户进行定…

Linux Ubuntu 20.04 安装DPDK方法指南

系统及DPDK版本 系统&#xff1a;Ubuntu 20.04 DPDK&#xff1a;20.11.10 Pktgen-DPDK&#xff1a;22.04.1 关于DPDK&#xff0c;其实Ubuntu的软件源中就已经包含了最新的Stable版本的DPDK&#xff0c;如果不想自己编译的话&#xff0c;直接 apt install dpdk 也是可以的 安…

接口测试学习笔记1

一、行业背景和测试分层 1、招聘需求 1&#xff09;手工测试&#xff1a;业务需求、业务逻辑 2&#xff09;自动化测试&#xff1a;业务逻辑 技术规范 功能自动化 QTP、Selenium 性能自动化 LoadRunner、JMeter 接口自动化 Postman、Fiddler、JMeter、SoapUI... …

电子电气架构 --- 车辆模式管理

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…