为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_笑_17 2023-04-17 16:30:50
目前,我有以下代码: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"!](基本上,引号应包含其中的所有内容作为数组中的一项,但终止引号不应表示数组中下一项的立即开始)。我该怎么做呢?
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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


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

}


查看完整回答
反对 回复 2023-04-17
?
富国沪深

TA贡献1790条经验 获得超9个赞

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

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

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

编辑:对这个特定表达式的一个警告是,一个单一的"会把一些东西分成两个结果,例如hi"there会分裂成hithere


查看完整回答
反对 回复 2023-04-17
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信