golang中的星号*通配符字符串模式匹配 和问号? 通配符字符串模式匹配的2种 ...

打印 上一主题 下一主题

主题 657|帖子 657|积分 1971

在go语言中,我们如果需要对字符串举行星号* 大概问号? 模式匹配, 可以有2种方法实现 通配符 * 问号 ? 匹配, 找出给定的输入字符串str是否与pattern字符串模式相匹配。
模式匹配函数使用文档参考 strutils package - github.com/tekintian/strutils - Go Packages
下面分别对这2种实现方式举行阐明
1. 正则实现* ?通配符模式匹配

  通过将字符串中的* ?通配符转换为对应的正则后使用正则表达式举行字符串匹配,实现代码如下:
  1. // 星号模式匹配* 和问号模式匹配 ,将模式匹配字符串转换为正则后使用正则进行匹配
  2. // @author: tekintian@gmail.com
  3. // @see https://dev.tekin.cn
  4. // @docs 使用文档 https://pkg.go.dev/github.com/tekintian/strutils#IsWmMatchingReg
  5. func IsWmMatchingReg(str, pattern string) bool {
  6.         // 模式匹配符 *, ? 转换为正则表达式, *替换为 (.*?), .需要进行转义为 \. ; 问号?转换为 (.?)
  7.         rp := strings.NewReplacer("*", `(.*?)`, ".", `\.`, "?", `(.?)`)
  8.         reg := rp.Replace(pattern) // 将v转换为正则表达式
  9.         // 如果正则中不包含前后限定符,则添加上
  10.         if !strings.HasPrefix(reg, "^") && !strings.HasSuffix(reg, "$") {
  11.                 reg = fmt.Sprintf(`^%s$`, reg) // 在正则中增加前后限定符
  12.         }
  13.         // 正则对象获取
  14.         regex, err := GetRegexp(reg)
  15.         if err != nil {
  16.                 return false
  17.         }
  18.         // 正则匹配
  19.         return regex.MatchString(str)
  20. }
复制代码
详细使用文档和示例代码参考 strutils package - github.com/tekintian/strutils - Go Packages 

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

通过创建一个二维矩阵matrix,此中matrix[j] 如果输入字符串中的第一个i字符与模式中的第一个j字符匹配,则为真。 这种方式结果和第一种正则的方式是一样的,只不外代码稍微复杂了一些。
  1. func IsWmMatching(str string, pattern string) bool {
  2.         rstrs := []rune(str)
  3.         rpats := []rune(pattern)
  4.         lenInput := len(rstrs)
  5.         lenPattern := len(rpats)
  6.         // 创建一个二维矩阵matrix,其中matrix[i][j] 如果输入字符串中的第一个i字符与模式中的第一个j字符匹配,则为真。
  7.         matrix := make([][]bool, lenInput+1)
  8.         for i := range matrix {
  9.                 matrix[i] = make([]bool, lenPattern+1)
  10.         }
  11.         matrix[0][0] = true
  12.         for i := 1; i < lenInput; i++ {
  13.                 matrix[i][0] = false
  14.         }
  15.         if lenPattern > 0 {
  16.                 if rpats[0] == '*' {
  17.                         matrix[0][1] = true
  18.                 }
  19.         }
  20.         for j := 2; j <= lenPattern; j++ {
  21.                 if rpats[j-1] == '*' {
  22.                         matrix[0][j] = matrix[0][j-1]
  23.                 }
  24.         }
  25.         for i := 1; i <= lenInput; i++ {
  26.                 for j := 1; j <= lenPattern; j++ {
  27.                         if rpats[j-1] == '*' {
  28.                                 matrix[i][j] = matrix[i-1][j] || matrix[i][j-1]
  29.                         }
  30.                         if rpats[j-1] == '?' || rstrs[i-1] == rpats[j-1] {
  31.                                 matrix[i][j] = matrix[i-1][j-1]
  32.                         }
  33.                 }
  34.         }
  35.         return matrix[lenInput][lenPattern]
  36. }
复制代码
单元测试用例

  1. func TestIsWmMatchingReg(t *testing.T) {
  2.         testCases := []struct {
  3.                 str     string
  4.                 pattern string
  5.                 ret     bool
  6.         }{
  7.                 {str: "https://www.tekin.cn", pattern: "*.tekin.cn", ret: true},
  8.                 {str: "dev.tekin.cn", pattern: "www.tekin.cn", ret: false},
  9.                 {str: "dev.tekin.cx", pattern: "dev.tekin.c?", ret: true},
  10.                 {str: "dev.tekin.cxxyy", pattern: "dev.tekin.c?", ret: false},
  11.         }
  12.         for _, v := range testCases {
  13.                 // ret := strutils.IsWmMatching(v.str, v.pattern)
  14.                 ret := strutils.IsWmMatchingReg(v.str, v.pattern)
  15.                 if ret != v.ret {
  16.                         t.Fatalf("failed to match %v, expected %v, got %v", v.str, v.ret, ret)
  17.                 }
  18.         }
  19. }
复制代码
总结:字符串的通配符* ?模式匹配的重点关注于对字符串的模式/格式举行验证,可以应用在对字符串的模式举行验证的场景,如CORS中的origin安全验证等场景,我们可以通过通配符来批量对答应的origin举行设置和验证,从而可以规避CORS的通配符和访问认证的相干问题。

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表