将字符串按空格拆分成数组,部分被引用时除外,golang中除外

目前,我有以下代码:


cmd := "echo \"Hello world\"!\x00"

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

args := re.FindAllString(cmd, -1)

fmt.Println("%v", args)

这会产生 array %v [echo "Hello world" !],但我希望输出是%v [echo "Hello world"!](基本上,引号应包含其中的所有内容作为数组中的一项,但终止引号不应表示数组中下一项的立即开始)。


我该怎么做呢?


qq_笑_17
浏览 99回答 2
2回答

白衣染霜花

改进的正则表达式。这只匹配引用段或非空白段。可以处理错误的单引号。package mainimport (    "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))}

富国沪深

您正在显式匹配", 然后是任意数量的^", 然后", 所以它当然会在第二个之后终止"。[^\s"']*如果您将其与(匹配除空格和 ) 之外的任何内容包装"在一个分组中,我认为它可能会为您提供所需的内容。让我知道这个结果是否令人满意。re := regexp.MustCompile(`[^\s"']+|([^\s"']*"([^"]*)"[^\s"']*)+|'([^']*)`)我不是很精通正则表达式的效率,所以如果这给表达式增加了太多的复杂性,请原谅。编辑:对这个特定表达式的一个警告是,一个单一的"会把一些东西分成两个结果,例如hi"there会分裂成hi和there。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go