regex - 在 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"
在此示例中未捕获。我错过了什么?
解决方案
如果您的命令定义明确,则 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])
}
推荐阅读
- google-apps-script - 如何将值设置为具有不同维度的范围
- python - 如何在python中绘制曲线和时间线条形图?
- list - 颤动中警报对话框上的下拉菜单
- visual-studio-code - 如何将 CLI args 与从源代码构建的 vscode 一起使用?
- angular - 使用 map 翻译 forEach 语句
- javascript - Vue.js“导入”在外部 js 文件中不起作用
- javascript - 事件是如何传递给这个函数的?
- c - 从 Go 传递 C-struct 时出现 _Ctype_struct_0 错误
- java - FCM 通知未发送声音
- spring - hibernate 是否有一些内部“提交 id”?