当前,我有以下代码:
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"!]
(基本上,引号应包含其中的所有内容作为数组中的一项,但是终止引号不应表示数组中下一项的立即开始。
我该怎么做?
答案 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
将分为hi
和there
。