Inhaltsverzeichnis
正确答案
Heim Backend-Entwicklung Golang Golang regexp MatchString() ist nicht idempotent

Golang regexp MatchString() ist nicht idempotent

Feb 05, 2024 pm 11:18 PM
overflow

Golang regexp MatchString() 不是幂等的

问题内容

我不知道发生了什么。使用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)
    }
}
Nach dem Login kopieren

输入: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})$
Nach dem Login kopieren

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
Nach dem Login kopieren

我使用 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
Nach dem Login kopieren
  • 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)
    }
}
Nach dem Login kopieren

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

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

每次输出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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der Preis von Bitcoin seit seiner Geburt 2009–2025. Die umfassendste Zusammenfassung der historischen BTC-Preise Der Preis von Bitcoin seit seiner Geburt 2009–2025. Die umfassendste Zusammenfassung der historischen BTC-Preise Jan 15, 2025 pm 08:11 PM

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 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 May 06, 2024 pm 01:20 PM

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? Gibt es Community-Foren oder Diskussionsgruppen für Java-Funktionen, in denen ich Fragen stellen und darüber diskutieren kann? Apr 28, 2024 pm 02:12 PM

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 So verwenden Sie den Code anderer Leute in Python May 05, 2024 pm 07:54 PM

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 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 May 03, 2024 pm 09:20 PM

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 Häufige Ausnahmetypen und ihre Reparaturmaßnahmen in der Java-Funktionsentwicklung May 03, 2024 pm 02:09 PM

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

Was bedeutet Überlauf in CSS? Was bedeutet Überlauf in CSS? Apr 28, 2024 pm 03:15 PM

Was bedeutet Überlauf in CSS?

Kümmert sich niemand um Douyins Zufallskonten? Kann ich ein zweites Mal Berufung einlegen? Kümmert sich niemand um Douyins Zufallskonten? Kann ich ein zweites Mal Berufung einlegen? May 03, 2024 am 09:37 AM

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

See all articles