登录
首页 >  Golang >  Go问答

解析字符串和命令行参数的 Go 编程技巧

来源:stackoverflow

时间:2024-03-07 08:03:23 124浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《解析字符串和命令行参数的 Go 编程技巧》,涉及到,有需要的可以收藏一下

问题内容

如何获取一个字符串并将其解析为一系列命令行参数?我希望能够获取一个字符串并使用 flag 和/或 pflag 解析它。我该怎么做?

package main

import (
    "fmt"
    "os"

    flag "github.com/spf13/pflag"
)

func main() {
    command := `unimportant -fb "quoted string"`
    var (
        foo bool
        bar string
    )
    flag.BoolVarP(&foo, "foo", "f", false, "foo")
    flag.StringVarP(&bar, "bar", "b", "default", "bar")

    // Parse command
    os.Args = append(os.Args, "-fb", "quoted string")
    flag.Parse()

    fmt.Println(command)
    fmt.Println("foo", foo)
    fmt.Println("bar", bar)
}

正确答案


最简单的方法是使用包 shellwords 将字符串解析为 shell 单词的 argv,然后使用除 flagpflag 之外的支持解析任意 argv 的命令行解析器(例如 flags,但有很多)可供选择。)

// parse  your string into an []string as the shell would.

argv, err := shellwords.parse("./foo --bar=baz")
// argv should be ["./foo", "--bar=baz"]

...

// define your options, etc. here

...

extraargs, err := flags.parseargs(&opts, argv)

正则表达式可用于检测每个参数。论证有两种可能的形式:

  1. 一组字母和一个负号:[-a-za-z]+
  2. 夹在两个“:”.*?“之间的东西

有关 regexp 包的信息:https://pkg.go.dev/regexp

有关 regexp 语法的信息:https://pkg.go.dev/regexp/[email protected]

re := regexp.mustcompile(`([-a-za-z]+)|(".*?[^\\]")|("")`)
command := `unimportant -fb "quoted string"`

allargs := re.findallstring(command, -1)

//fmt.printf("%+v\n", allargs)

// to remove "
for _, arg := range allargs {
    if arg[0] == '"' {
        arg = arg[1 : len(arg)-1]
    }
    fmt.println(arg)
}

输出:

unimportant
-fb
quoted string

今天关于《解析字符串和命令行参数的 Go 编程技巧》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>