返回顶部
首页 > 资讯 > 后端开发 > GO >Golang regexp MatchString() 不是幂等的
  • 135
分享到

Golang regexp MatchString() 不是幂等的

overflow 2024-02-06 06:02:00 135人浏览 八月长安
摘要

问题内容 我不知道发生了什么。使用golang的regexp库时,相同的函数相同的输入返回不同的结果。 package main import ( "fmt" "re

问题内容

我不知道发生了什么。使用golang的regexp库时,相同的函数相同的输入返回不同的结果。

package main

import (
    "fmt"
    "regexp"
)

type paymentnetworkdata struct {
    regex string
    name  string
}

var payment_networks = map[string]paymentnetworkdata{
    "mastercard": {
        regex: "^5[1-5][0-9]{14}|^(222[1-9]|22[3-9]\\d|2[3-6]\\d{2}|27[0-1]\\d|2720)[0-9]{12}$",
        name:  "mastercard",
    },
    "visamaster": {
        regex: "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$",
        name:  "visamaster",
    },
}

func resolvepaymentnetwork(cardin string) string {
    paynet := "unknown"
    for _, v := range payment_networks {
        regex := regexp.mustcompile(v.regex)

        if regex.matchstring(cardin) {
            paynet = v.name
        }
    }
    return paynet
}

func main() {

    in := "5103901404433835"

    for i := 1; i < 100; i++ {
        paynet := resolvepaymentnetwork(in)
        fmt.println("payment network is: ", paynet)
    }
}

输入:5103901404433835

正则表达式

mastercard: ^5[1-5][0-9]{14}|^(222[1-9]|22[3-9]\\d|2[3-6]\\d{2}|27[0-1]\\d|2720)[0-9]{12}$
visamaster: ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$

Go 语言输出:

payment network is:  visamaster
payment network is:  mastercard
payment network is:  mastercard
payment network is:  visamaster
payment network is:  visamaster
payment network is:  visamaster
payment network is:  visamaster
payment network is:  visamaster
payment network is:  visamaster

我使用 nodejs 测试了相同的代码,在本例中结果始终相同。

js 输出:

Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
Payment Network is:  VisaMaster
  • go 代码演示:https://go.dev/play/p/up4g0jowlv_l
  • js 代码演示:Https://playcode.io/1450178


正确答案


您的代码有几个问题:

  1. 没有明显原因使用 map
  2. 两个正则表达式都与提供的卡号匹配。

这些问题,以及通过映射迭代不能保证产生相同序列的事实,导致函数非幂等。

这是更正后的代码:

package main

import (
    "fmt"
    "regexp"
)

type PaymentNetworkData struct {
    Regex *regexp.Regexp
    Name  string
}

var PAYMENT_NETWORKS = [2]PaymentNetworkData{
    {
        Regex: regexp.MustCompile("^(?:5[1-5][0-9]{14}|(?:222[1-9]|22[3-9]\\d|2[3-6]\\d{2}|27[0-1]\\d|2720)[0-9]{12})$"),
        Name:  "Mastercard",
    },
    {
        Regex: regexp.MustCompile("^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$"),
        Name:  "VisaMaster",
    },
}

func resolvePaymentNetwork(cardIn string) string {
    for _, v := range PAYMENT_NETWORKS {
        if v.Regex.MatchString(cardIn) {
            return v.Name
        }
    }
    return "Unknown"
}

func main() {
    in := "5103901404433835"

    for i := 1; i < 100; i++ {
        payNet := resolvePaymentNetwork(in)
        fmt.Println("Payment Network is: ", payNet)
    }
}

它使用数组而不是映射来保证顺序。

此外,我还更改了您的结构,使其仅编译一次正则表达式。

每次输出payment network为:mastercard

演示此处。

注意,它仍然使用相同的正则表达式(由 评论中的@wiktorstribiżew)。它们看起来不太好,尤其是这部分 (?:4[0-9]{12}(?:[0-9]{3})? - 它也会匹配 13 位数字。
您最好检查卡号的预期格式,并相应地更正表达式。

以上就是Golang regexp MatchString() 不是幂等的的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang regexp MatchString() 不是幂等的

本文链接: https://lsjlt.com/news/561226.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang regexp MatchString() 不是幂等的
    问题内容 我不知道发生了什么。使用golang的regexp库时,相同的函数相同的输入返回不同的结果。 package main import ( "fmt" "re...
    99+
    2024-02-06
    overflow
  • golang是不是中国的
    这篇文章主要讲解了“golang是不是中国的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang是不是中国的”吧!golang不是中国的。golang是Google开发的一种静态强类型...
    99+
    2023-07-04
  • golang是不是免费的
    本文小编为大家详细介绍“golang是不是免费的”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang是不是免费的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。golang是免费的。Golang是Googl...
    99+
    2023-07-04
  • javascript的不等于是什么符号
    这篇文章主要介绍“javascript的不等于是什么符号”,在日常操作中,相信很多人在javascript的不等于是什么符号问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ja...
    99+
    2024-04-02
  • Golang比较两个slice是否相等的问题
    目录1、为什么在Golang中无法直接使用==来比较两个slice?2、如何实现两个slice的比较呢?2.1 深度比较2.2 使用reflect.DeepEqual函数3、扩展:如...
    99+
    2023-03-22
    Golang比较两个slice相等 Golang比较slice相等
  • php中!==不全等于的用法是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php中!==不全等于的用法是什么绝对不等于 如果 x 不等于 y,或它们类型不相同,则返回 true 5!=="5" 返回 true...
    99+
    2021-01-28
    PHP
  • sql中表示不等于的方式是什么
    小编给大家分享一下sql中表示不等于的方式是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、sql中有两种方式表示不等于,...
    99+
    2024-04-02
  • php相同的数不相等是什么原因
    这篇文章主要为大家展示了php相同的数不相等是什么原因,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“php相同的数不相等是什么原因”这篇文章吧。当php相同的数判断出不相等时,说明它们虽然数值一样...
    99+
    2023-06-14
  • java判断字符串是否不相等的方法
    判断地址是否相等 用:==Object类作为所有类的超类,而Object类的equals方法是直接比较地址的,源码如下:public boolean equals(Object obj) { return th...
    99+
    2017-12-05
    java
  • php中相同的值可能不等于的原因是什么
    这篇文章主要介绍“php中相同的值可能不等于的原因是什么”,在日常操作中,相信很多人在php中相同的值可能不等于的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中相同的值可能不等于的原因是什么...
    99+
    2023-07-05
  • java不建议用equals判断对象相等的原因是什么
    这篇文章主要介绍“java不建议用equals判断对象相等的原因是什么”,在日常操作中,相信很多人在java不建议用equals判断对象相等的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java不...
    99+
    2023-07-05
  • float元素不能指定margin和padding等属性的原因是什么
    这篇文章主要为大家展示了“float元素不能指定margin和padding等属性的原因是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“float元素不能指...
    99+
    2024-04-02
  • Golang 函数文档中的哪些部分是必不可少的?
    golang 函数文档必备部分包括:函数签名:包含函数名称、参数和返回值类型参数描述:描述每个参数的类型和含义返回值描述:表明返回值类型和含义示例用法:展示如何调用函数注意事项:突出函数...
    99+
    2024-05-04
    golang 函数文档 键值对
  • 调取接口,获取的格式是GBK或者GB2312等格式而不是utf-8时怎么办
    引言:今天在获取某物流的渠道列表时发现,调接口返回了数据,但是用json_decode函数要把它转数组是发现转完是空,后用postman工具调接口是发现,返回数据的格式是GBK。解决办法是添加‘hea...
    99+
    2023-09-01
    json php
  • 揭秘 Golang 字符串背后的秘密:可变还是不可变
    go 字符串不可变,但可以通过指针修改。1. 字符串是值类型,分配新变量时创建新值。2. 指针可以指向字符串并修改其内容。3. 字符串拼接创建新副本,不影响原字符串。 深入浅出:揭开 ...
    99+
    2024-04-08
    字符串 golang
  • 也许是 golang 中的 bag(类型字符串和字符串不匹配)
    php小编新一为您介绍golang中的bag类型。在golang中,bag类型指的是一种数据结构,用于存储元素的集合。与其他数据结构不同的是,bag中的元素可以重复出现,并且顺序无关紧...
    99+
    2024-02-09
    lsp
  • Golang - flag.Arg(0) 返回 exec.cmd 传递的参数的索引 1 而不是索引 0
    Golang是一种快速、高效、可靠的编程语言,而flag.Arg(0)是Golang中一个常用的函数,用于返回exec.cmd传递的参数的索引1。然而,php小编子墨指出,这个函数的行...
    99+
    2024-02-10
  • 如何附加到元素类型不是golang中命名类型的切片
    php小编香蕉为您介绍如何附加到元素类型不是golang中命名类型的切片。在Golang中,我们可以使用内置的append函数将元素附加到切片中,但是如果切片的元素类型不是命名类型,即...
    99+
    2024-02-09
  • 阿里云服务器不是IIS,而是基于Apache、Nginx和Tomcat等开源Web服务器技术的云计算服务
    阿里云服务器是一款由阿里云提供的云计算产品,它提供了包括Web服务器、数据库、网络服务、安全服务等多种服务,是用户进行云计算的平台。而IIS则是Windows操作系统自带的Web服务器。 一、阿里云服务器与IIS的比较 1.平台支持:IIS...
    99+
    2023-12-11
    服务器 阿里 开源
  • 为什么 int、int64 等不是 go 中的关键字?如果它们是预先声明的标识符,那么它们的声明在通用块中会是什么样子?
    本篇文章给大家分享《为什么 int、int64 等不是 go 中的关键字?如果它们是预先声明的标识符,那么它们的声明在通用块中会是什么样子?》,覆盖了Golang的常见基础知识,其实一个语言的全部知...
    99+
    2024-04-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作