regex - Golang 正则表达式与 `ReplaceAllString` 的多个匹配项

标签 regex go

我正在尝试编写一些正则表达式来匹配和分离看起来像软件版本的字符串(但实际上并非如此,例如,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

它很容易变得复杂。这就是为什么您应该从一开始就为每个有趣的案例编写测试。

关于regex - Golang 正则表达式与 `ReplaceAllString` 的多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54284613/

相关文章:

regex - 在 TSV 的匹配之前/之后插入换行符

python - 在 Python 中自动检测 C/C++ 循环并放置大括号

go - 如何在打开文件的函数之外关闭文件?

go - 不能对 r.route 进行 slice (输入 *[]Route)

go - 类型更改未按预期运行

go - docker 命令行列表参数

go - 如何使用任意或已弃用的扩展名签署证书

javascript - 如何防止javascript中的非字母数字输入?

javascript - 在 JavaScript 中使用正则表达式匹配换行符

javascript - 使用 javascript 删除 <pre> 中的空行?