首页 > 解决方案 > 如何使用正则表达式分隔双引号字符串和非双引号字符串?

问题描述

我正在尝试构建一个接受参数的插件,每个参数可以是双引号字符串或非双引号字符串。

有效参数的一些示例:

  1. "random token"
  2. "random token" 34
  3. "randomtoken"

所以我正在尝试编写一个parseParameters返回两个值的函数,一个是双引号字符串中的内容,另一个是非双引号字符串。

我尝试用两个正则表达式解决这个问题

  1. \"(.*?)\"\s*\d*- https://regex101.com/r/uB4sI9/145
  2. \"(.*?)\"- https://regex101.com/r/Pnh9Xd/1

下面是我尝试过的代码的一个版本(虽然在某些情况下不起作用):

下面代码中的变量parameters将是一个列表。像 ["\"random, "token\"", "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\""]

输出:("random token", ""第一个值指定双引号字符串,而另一个值指定非双引号字符串)

输入:["\"random", "token\"", "45"]

输出:["\"随机令牌\"", 45]

请注意,双引号在输入中被转义。

标签: regexgo

解决方案


您可以使用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]

}

您可以在此处找到示例程序的工作链接


推荐阅读