目前,我有以下代码: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))
}
富国沪深
TA贡献1790条经验 获得超9个赞
您正在显式匹配"
, 然后是任意数量的^"
, 然后"
, 所以它当然会在第二个之后终止"
。[^\s"']*
如果您将其与(匹配除空格和 ) 之外的任何内容包装"
在一个分组中,我认为它可能会为您提供所需的内容。让我知道这个结果是否令人满意。
re := regexp.MustCompile(`[^\s"']+|([^\s"']*"([^"]*)"[^\s"']*)+|'([^']*)`)
我不是很精通正则表达式的效率,所以如果这给表达式增加了太多的复杂性,请原谅。
编辑:对这个特定表达式的一个警告是,一个单一的"
会把一些东西分成两个结果,例如hi"there
会分裂成hi
和there
。
- 2 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消