首页 > 解决方案 > 在 GO 中捕获重复组

问题描述

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

例如,以下每一行:

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"在此示例中未捕获。我错过了什么?

标签: regexgo

解决方案


如果您的命令定义明确,则 ei 命令名称始终为大写,并且参数始终位于命令之后,那么更宽松的正则表达式可能适合您的用例:

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])
}

操场


推荐阅读