Golang regexp MatchString() ist nicht idempotent
Feb 05, 2024 pm 11:18 PM我不知道发生了什么。使用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 位数字。
您最好检查卡号的预期格式,并相应地更正表达式。
Das obige ist der detaillierte Inhalt vonGolang regexp MatchString() ist nicht idempotent. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Der Preis von Bitcoin seit seiner Geburt 2009–2025. Die umfassendste Zusammenfassung der historischen BTC-Preise

Was tun, wenn die Zeit in der unteren rechten Ecke von Windows 11 abgelaufen ist_Was zu tun ist, wenn die Zeit in der unteren rechten Ecke von Windows 11 abgelaufen ist

Gibt es Community-Foren oder Diskussionsgruppen für Java-Funktionen, in denen ich Fragen stellen und darüber diskutieren kann?

So verwenden Sie den Code anderer Leute in Python

Was soll ich tun, wenn die Uhrzeit auf meinem Win11-Computer immer falsch ist? So stellen Sie die falsche Uhrzeit auf einem Windows 11-Computer ein

Häufige Ausnahmetypen und ihre Reparaturmaßnahmen in der Java-Funktionsentwicklung

Kümmert sich niemand um Douyins Zufallskonten? Kann ich ein zweites Mal Berufung einlegen?
