文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go中如何正确处理带有转义的字符串?

2024-02-05 22:11

关注

问题内容

我正在创建一个程序,该程序正在处理和计算开源存储库和库的大小,并将数据保存到数据库中以供进一步分析。

  • 我有一个输入字符串:github.com/azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1
  • 解析为格式:github.com/\!azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1
  • 然后我将其解析为 /home/username/dev/glass/tmp/pkg/mod/github.com/\!azure/[email protected] 格式,这是我的文件系统中的有效路径,我在其中已下载该特定的 go 库。
  • 之后,我将该路径传递给 gocloc -程序 (https://github.com/hhatto/gocloc)
  • 并解析结果。

但问题是,当我将字符串 /home/username/dev/glass/tmp/pkg/mod/github.com/\!azure/[email protected] 保存到变量中时,go 实际上添加了对我保存的字符串的另一个转义,因此它实际上是内存中的 /home/username/dev/glass/tmp/pkg/mod/github.com/\\!azure/[email protected] 。 (fmt.println - 例如删除它)

问题是,当我将该字符串作为参数传递给 os/exec(运行 gocloc 和该路径字符串)时,它运行带有两个转义符的命令 - 这不是有效的路径。

有什么办法可以解决这个问题吗?对我来说,一个想法是只创建一个关于我想做的事情的 shell 脚本

此函数将 github.com/azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 解析为 github.com/\!azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a 格式1 - 及之后这被保存到一个变量中,并且该变量比它应该有的多了一次转义。

func parseurltovendordownloadformat(input string) string {
    // split the input string on the first space character
    parts := strings.splitn(input, " ", 2)
    if len(parts) != 2 {
        return ""
    }

    // split the package name on the '/' character
    packagenameparts := strings.split(parts[0], "/")

    // add the '\!' prefix and lowercase each part of the package name
    for i, part := range packagenameparts {
        if hasuppercase(part) {
            packagenameparts[i] = "\\!" + strings.tolower(part)
        }
    }

    // join the modified package name parts with '/' characters
    packagename := strings.join(packagenameparts, "/")

    return strings.replaceall(packagename+"@"+parts[1], `\\!`, `\!`)
}

之后,字符串被解析为以下格式:/home/username/dev/glass/tmp/pkg/mod/github.com/\!azure/[email protected]

传递给此函数:

// alternative gocloc - command.
func linesofcode(dir string) (int, error) {
    // run the `gocloc` command in the specified directory and get the output
    cmd := exec.command("gocloc", dir)
    output, err := cmd.output()
    if err != nil {
        return 0, err
    }

    lines, err := parsetotallines(string(output))
    if err != nil {
        return 0, err
    }

    return lines, nil
}

它使用这个解析函数:

// Parse from the GoCloc response.
func parseTotalLines(input string) (int, error) {
    // Split the input string into lines
    lines := strings.Split(input, "\n")

    // Find the line containing the "TOTAL" row
    var totalLine string
    for _, line := range lines {
        if strings.Contains(line, "TOTAL") {
            totalLine = line
            break
        }
    }

    // If the "TOTAL" line was not found, return an error
    if totalLine == "" {
        return 0, fmt.Errorf("could not find TOTAL line in input")
    }

    // Split the "TOTAL" line into fields
    fields := strings.Fields(totalLine)

    // If the "TOTAL" line doesn't have enough fields, return an error
    if len(fields) < 4 {
        return 0, fmt.Errorf("invalid TOTAL line: not enough fields")
    }

    // Get the fourth field (the code column)
    codeStr := fields[3]

    // Remove any commas from the code column
    codeStr = strings.Replace(codeStr, ",", "", -1)

    // Parse the code column as an integer
    code, err := strconv.Atoi(codeStr)
    if err != nil {
        return 0, err
    }

    return code, nil
}

我尝试过的:

  • 使用 gocloc 作为库,但无法正常工作。
  • 使用单引号而不是转义符,没有让它工作,但我认为可能有一些东西。

解决这个问题的一种方法可能是创建单独的 shell 脚本并将目录作为参数传递给该脚本,并消除那里的转义,我不知道......

如果您想观察所有源代码:https://github.com/haapjari/glass,更具体地说,是文件 https://github.com/haapjari/glass/blob/main/pkg/plugins /goplg/plugin.go 和函数 enrichwithlibrarydata() 和 utils 函数,位于:https://github.com/haapjari/glass/blob/main/pkg/plugins/goplg/utils.go (上面的示例)

有什么想法吗?如何进行?提前致谢!


正确答案


我有一个输入字符串:github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1

解析为格式:github.com/\!azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1

您的解析器似乎有错误。我希望 Azure 成为 !azure:

github.com/!azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1

Go 模块参考

为了避免在不区分大小写的文件系统中提供服务时出现歧义,$module 和 $version 元素进行大小写编码,方法是将每个大写字母替换为感叹号,后跟相应的小写字母。这允许模块 example.com/mexample.com/m 都存储在磁盘上,因为前者被编码为 example.com/!m

以上就是Go中如何正确处理带有转义的字符串?的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯