目錄
Golang regexp MatchString() 不是冪等的
overflow
问题内容
我不知道发生了什么。使用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() 不是冪等的的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前
By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
擊敗分裂小說需要多長時間?
3 週前
By DDD
R.E.P.O.保存文件位置:在哪里以及如何保護它?
3 週前
By DDD

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Windows11右下角時間沒了怎麼辦_Windows11右下角時間沒了解決方法
