Golang regexp MatchString() 不是幂等的
短信预约 -IT技能 免费直播动态提醒
问题内容
我不知道发生了什么。使用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
正确答案
您的代码有几个问题:
- 没有明显原因使用
map
, - 两个正则表达式都与提供的卡号匹配。
这些问题,以及通过映射迭代不能保证产生相同序列的事实,导致函数非幂等。
这是更正后的代码:
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() 不是幂等的的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Golang regexp MatchString() 不是幂等的
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
Golang regexp MatchString() 不是幂等的
问题内容我不知道发生了什么。使用golang的regexp库时,相同的函数相同的输入返回不同的结果。package mainimport ("fmt""regexp")type paymentnetworkdata struct {r
2024-02-06
golang是不是中国的
这篇文章主要讲解了“golang是不是中国的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang是不是中国的”吧!golang不是中国的。golang是Google开发的一种静态强类型
2023-07-04
golang是不是免费的
本文小编为大家详细介绍“golang是不是免费的”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang是不是免费的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。golang是免费的。Golang是Googl
2023-07-04
Golang比较两个slice是否相等的问题
本文主要介绍了Golang比较两个slice是否相等的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-22
2024-04-02
php中!==不全等于的用法是什么
在PHP中,“!==”不全等于也叫绝对不等于运算符,当运算符两边数值不相同或者类型不相同时,返回的结果是“true”,否则返回“false”,语法为“x !== y”。
2021-01-28
2024-04-25
2024-04-02
php相同的数不相等是什么原因
这篇文章主要为大家展示了php相同的数不相等是什么原因,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“php相同的数不相等是什么原因”这篇文章吧。当php相同的数判断出不相等时,说明它们虽然数值一样
2023-06-14
java判断字符串是否不相等的方法
1、判断地址是否相等 用:==Object类作为所有类的超类,而Object类的equals方法是直接比较地址的,源码如下:public boolean equals(Object obj) { return this == obj;
2017-12-05
php中相同的值可能不等于的原因是什么
这篇文章主要介绍“php中相同的值可能不等于的原因是什么”,在日常操作中,相信很多人在php中相同的值可能不等于的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中相同的值可能不等于的原因是什么
2023-07-05
Golang 函数文档中的哪些部分是必不可少的?
golang 函数文档必备部分包括:函数签名:包含函数名称、参数和返回值类型参数描述:描述每个参数的类型和含义返回值描述:表明返回值类型和含义示例用法:展示如何调用函数注意事项:突出函数使用限制或注意事项Golang 函数文档的必备部分在
2024-05-04
java不建议用equals判断对象相等的原因是什么
这篇文章主要介绍“java不建议用equals判断对象相等的原因是什么”,在日常操作中,相信很多人在java不建议用equals判断对象相等的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java不
2023-07-05
2024-04-02
揭秘 Golang 字符串背后的秘密:可变还是不可变
go 字符串不可变,但可以通过指针修改。1. 字符串是值类型,分配新变量时创建新值。2. 指针可以指向字符串并修改其内容。3. 字符串拼接创建新副本,不影响原字符串。深入浅出:揭开 Go 字符串的可变性与不可变性之谜在 Go 语言中,字符
2024-04-08
2023-09-01
也许是 golang 中的 bag(类型字符串和字符串不匹配)
php小编新一为您介绍golang中的bag类型。在golang中,bag类型指的是一种数据结构,用于存储元素的集合。与其他数据结构不同的是,bag中的元素可以重复出现,并且顺序无关紧要。这意味着,bag类型在处理不需要顺序的情况下非常有用
2024-02-09
Golang - flag.Arg(0) 返回 exec.cmd 传递的参数的索引 1 而不是索引 0
Golang是一种快速、高效、可靠的编程语言,而flag.Arg(0)是Golang中一个常用的函数,用于返回exec.cmd传递的参数的索引1。然而,php小编子墨指出,这个函数的行为与预期不符,实际上它返回的是索引1而不是索引0。这个问
2024-02-10
如何附加到元素类型不是golang中命名类型的切片
php小编香蕉为您介绍如何附加到元素类型不是golang中命名类型的切片。在Golang中,我们可以使用内置的append函数将元素附加到切片中,但是如果切片的元素类型不是命名类型,即匿名类型,我们需要先创建一个临时切片,然后将元素附加到临
2024-02-09
阿里云服务器不是IIS,而是基于Apache、Nginx和Tomcat等开源Web服务器技术的云计算服务
阿里云服务器是一款由阿里云提供的云计算产品,它提供了包括Web服务器、数据库、网络服务、安全服务等多种服务,是用户进行云计算的平台。而IIS则是Windows操作系统自带的Web服务器。一、阿里云服务器与IIS的比较1.平台支持:IIS只支持Windows操作系统,而阿里云服务器则支持多种操作系统,包括Windo
2023-12-11