目錄
正确答案
首頁 後端開發 Golang Golang regexp MatchString() 不是冪等的

Golang regexp MatchString() 不是冪等的

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)
    }
}
登入後複製

输入: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() 不是冪等的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

比特幣誕生至今價格2009-2025 最完整的BTC歷史價格總表 比特幣誕生至今價格2009-2025 最完整的BTC歷史價格總表 Jan 15, 2025 pm 08:11 PM

比特幣誕生至今價格2009-2025 最完整的BTC歷史價格總表

Windows11右下角時間沒了怎麼辦_Windows11右下角時間沒了解決方法 Windows11右下角時間沒了怎麼辦_Windows11右下角時間沒了解決方法 May 06, 2024 pm 01:20 PM

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

Java 函數有哪些社群論壇或討論群組可以提問與討論? Java 函數有哪些社群論壇或討論群組可以提問與討論? Apr 28, 2024 pm 02:12 PM

Java 函數有哪些社群論壇或討論群組可以提問與討論?

怎麼用別人的程式碼 怎麼用別人的程式碼 May 05, 2024 pm 07:54 PM

怎麼用別人的程式碼

win11電腦時間一直不對怎麼辦? win11電腦時間不對怎麼調整方法 win11電腦時間一直不對怎麼辦? win11電腦時間不對怎麼調整方法 May 03, 2024 pm 09:20 PM

win11電腦時間一直不對怎麼辦? win11電腦時間不對怎麼調整方法

Java 函數開發中常見的異常類型及其修復措施 Java 函數開發中常見的異常類型及其修復措施 May 03, 2024 pm 02:09 PM

Java 函數開發中常見的異常類型及其修復措施

overflow在css中是什麼意思 overflow在css中是什麼意思 Apr 28, 2024 pm 03:15 PM

overflow在css中是什麼意思

抖音亂封帳號沒人管嗎?可以二次申訴嗎? 抖音亂封帳號沒人管嗎?可以二次申訴嗎? May 03, 2024 am 09:37 AM

抖音亂封帳號沒人管嗎?可以二次申訴嗎?

See all articles