按空格将字符串拆分为数组,除非对part进行了引号(golang例外)

时间:2018-10-05 16:14:15

标签: regex go split

当前,我有以下代码:

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 :(得分:1)

改进的正则表达式。这仅与引用的段或非空格段匹配。可以处理错误的单引号。

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))
}

答案 1 :(得分:0)

您要明确匹配",然后匹配任意数量的^",然后匹配",因此,它当然会在第二个"之后终止。如果您将[^\s"']*(除空格和"以外的任何内容)分组,则可以将其包装起来,我认为它可以为您提供所需的内容。让我知道这个结果是否令人满意。

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

游乐场示例:https://play.golang.org/p/fWWsx7dIIRd

我对规则表达式的效率不是很精通,所以请原谅这会给表达式增加太多复杂性。

编辑:对此特定表达式的一个警告是,单个"会将某些内容分解为两个结果,例如hi"there将分为hithere