Разбить строку по пробелам в массиве, кроме случаев, когда часть заключена в кавычки, с исключениями в golang - PullRequest
0 голосов
/ 05 октября 2018

В настоящее время у меня есть следующий код:

cmd := "echo \"Hello world\"!\x00"
re := regexp.MustCompile(`[^\s"']+|"([^"]*)"|'([^']*)`)
args := re.FindAllString(cmd, -1)
fmt.Println("%v", args)

Это дает массив %v [echo "Hello world" !], но я хочу, чтобы вывод был %v [echo "Hello world"!] (в основном, кавычки должны содержать все внутри них как единое целоеэлемент в массиве, но завершающая кавычка не должна сигнализировать о немедленном начале следующего элемента в массиве.

Как мне поступить?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Улучшено регулярное выражение.Это просто соответствует цитированным сегментам или сегментам без пробелов.Может обрабатывать ошибочные одинарные кавычки.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    cmd := "echo \"Hello world\"!\x00"
    re := regexp.MustCompile(`("[^"]+?"\S*|\S+)`)
    args := re.FindAllString(cmd, -1)
    fmt.Println("%v", args)
    fmt.Println("%v", len(args))
}
0 голосов
/ 05 октября 2018

Вы явно соответствуете ", затем любое число ^", затем ", поэтому, конечно, оно заканчивается после второго ".Если бы вы обернули это в [^\s"']* (сопоставляя что-либо, кроме пробелов и ") в группе, я думаю, что это может дать вам то, что вы ищете.Дайте мне знать, если этот результат удовлетворительный.

re := regexp.MustCompile(`[^\s"']+|([^\s"']*"([^"]*)"[^\s"']*)+|'([^']*)`)

Пример игровой площадки: https://play.golang.org/p/fWWsx7dIIRd

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

РЕДАКТИРОВАТЬ: Одно предостережение для этого конкретного выражения заключается в том, что один " будет разбить что-то на два результата, например, hi"there будет разделен на hi и there.

...