我正在尝试构建一个接受参数的插件,并且每个参数可以是双引号字符串或非双引号字符串。
一些有效参数的示例:
"random token"
"random token" 34
"randomtoken"
因此,我试图编写一个parseParameters
函数,该函数将返回两个值,一个是双引号字符串中的内容,另一个是非双引号字符串。
我尝试用两个正则表达式解决这个问题
\"(.*?)\"\s*\d*
-https://regex101.com/r/uB4sI9/145 \"(.*?)\"
-https://regex101.com/r/Pnh9Xd/1 下面是我尝试过的代码的一个版本(虽然在某些情况下不起作用):
以下代码中的变量parameters
将成为一个列表。类似于[“ \”随机,“令牌\”“,” 45“]
paramString := strings.Join(parameters, " ")
regex, _ := regexp.Compile(`\"(.*?)\"\s*\d*`)
tempString := regex.FindString(paramString)
if len(parameters) == 1 && tempString != "" {
tempString = strings.TrimLeft(strings.TrimRight(tempString, `\"`), `\"`)
return tempString, "", true
}
if paramString != tempString {
return "", "", false
}
splitBySpace := strings.Split(tempString, " ")
doubleQuoted := strings.TrimLeft(strings.TrimRight(tempString, `\"`), `\"`)
nonDoubleQuoted := splitBySpace[len(splitBySpace)-1]
return doubleQuoted, nonDoubleQuoted, true
预期的输入和输出:
输入:[“ \”随机“,”令牌\“”]
输出:"random token", ""
(第一个值指定双引号字符串,另一个值指定非双引号字符串)
输入:[“ \”随机“,”令牌\“”,“ 45”]
输出:[“ \”随机令牌\“”,45]
请注意,输入中的双引号会转义。
答案 0 :(得分:0)
您可以使用regex.FindAllStringSubmatch
。
以下功能可以完成此任务,该功能假定输入为单个字符串,例如"random token" 32
func parse(str string) (string, string) {
regex, _ := regexp.Compile(`("[^"]*")\s*(\S*)`)
submatches := regex.FindAllStringSubmatch(str, -1)
if len(submatches) == 0 {
return "",""
}
return submatches[0][1], submatches[0][2]
}
您可以找到指向示例程序here
的有效链接。