簡體   English   中英

Golang regexp 與`ReplaceAllString` 多次匹配

[英]Golang regexp multiple matches with `ReplaceAllString`

我正在嘗試編寫一些正則表達式來匹配和分離看起來像軟件版本的字符串(但它們不是真的,例如,semver 解析將不起作用)。 我在匹配輸入字符串的“前綴”和“后綴”部分時遇到了一些麻煩。

我從下面得到的輸出是,奇怪..

// Sample inputs:
// * '1.2.3-thing' (Prefix: '1.2.3', Suffix: '-thing')
// * '1.2.3+1' (Prefix: '1.2.3', Suffix: '+1')
// * '1.2.3' (Prefix: '1.2.3', Suffix: '')
// * '1' (Prefix: '1', Suffix: '')
// * '1-x' (Prefix: '1', Suffix: '-x')
// * '1-x-x' (Prefix: '1', Suffix: '-x-x')
// * '1.2.3-thing.1' (Prefix: '1.2.3', Suffix: '-thing.1')
// * '1.2-thing-1' (Prefix: '1.2', Suffix: '-thing-1')
// * 'k1.2.3-thing' (Prefix: 'k1.2.3', Suffix: '-thing')
// * 'k-thing-x' (Prefix: 'k', Suffix: '-thing-x')
//
func InspectVersionTag(tag string) {
    re := regexp.MustCompile(`^([^\-]+)([\-+].+)$`)
    suffix := ""
    if re.MatchString(tag) {
        tag = re.ReplaceAllString(tag, `$1`)
        suffix = re.ReplaceAllString(tag, `$2`)
    }
    fmt.Println(fmt.Sprintf("Prefix is: %s", tag))
    fmt.Println(fmt.Sprintf("Suffix is: %s", suffix))
}

// Current sample output
//
// Input: 1.2.3+1
// Prefix is: 1.2.3
// Suffix is: 1.2.3

鑒於您的樣本,這應該很容易。 我從頭頂寫了以下代碼。 它甚至可能無法編譯,但您應該明白:

func parseVersion(ver string) (prefix, suffix string) {
    parts := strings.SplitAfter(ver, "-", 2)
    if len(parts) == 1 {
        parts = strings.SplitAfter(ver, "+", 2)
    }
    if len(parts) == 1 {
        return ver, ""
    }
    return parts[0], parts [1]
}

您絕對應該在自動測試中列出所有示例而不是注釋。 如果上面的代碼沒有幫助,你的例子就不夠現實。

這是我解決類似問題的方法。 在這里查看Test_MkParser_PkgbasePatternTest_MkParser_Dependency

https://github.com/rillig/pkglint/blob/master/mkparser_test.go

它很容易變得復雜。 這就是為什么您應該從一開始就為每個有趣的案例編寫測試。

對於這個簡單的任務,正則表達式是錯誤的工具,因為它很慢,難以閱讀,而且正如這個問題所表明的那樣,難以推理。 出於同樣的原因,regexp 對於它所執行的幾乎所有任務來說都是錯誤的工具。

在您的情況下,您需要做的只是在分隔符上拆分: -+

func InspectVersionTag(tag string) {
    var suffix string
    for _, sep := range []string{"-","+"} {
        if strings.Contains(tag, sep) {
            parts := strings.SplitN(tag, sep, 2)
            tag, suffix = parts[0], sep+parts[1]
            continue
        }
    }
    fmt.Printf("Prefix: %s Suffix: %s\n", tag, suffix)
}

請參閱游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM