我正在尝试创建一个函数,该函数可以解析由大写单词后跟零个或多个封装在双引号中的参数组成的字符串。

例如,以下每一行:

COPY "filename one" "filename two"
REMOVE "filename"
LIST "x" "y" "z"
DISCONNECT

结果应该是一个字符串(命令)后跟一个字符串[](引号内的参数)。我创建了以下正则表达式:
re1, _ := regexp.Compile(`([A-Z]+)(?: "([^"]+)")*`)
results := re1.FindAllStringSubmatch(input, -1)

但是,无论我尝试什么,都只会捕获最后一个参数。

我的问题的一个例子:https://play.golang.org/p/W1rE1X4SWf5

本示例中未捕获 "arg1"。我错过了什么?

最佳答案

如果您的命令定义明确,e.i.命令名称总是大写,参数总是在命令之后,那么松散的正则表达式可能适合你的用例:

re1, _ := regexp.Compile(`([A-Z]+)|(?: "([^"]+)")`)
results := re1.FindAllStringSubmatch(`COMMAND "arg1" "arg2" "arg3"`, -1)

fmt.Println("Command:", results[0][1])
for _, arg := range results[1:] {
    fmt.Println("Arg:", arg[2])
}

Playground

关于regex - 在 GO 中捕获重复组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53434310/

10-12 04:38