Как разделить строки с двойными кавычками и строки без двойных кавычек с помощью регулярных выражений? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь создать плагин, который принимает параметры, и каждый из параметров может быть строкой с двойными кавычками или строкой без двойных кавычек.

Некоторые примеры допустимых параметров:

  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]

Обратите внимание, что двойные кавычки экранируются во входных данных.

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете использовать 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]

}

Вы можете найти рабочую ссылку на образец программы здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...