在JavaScript中将字符串解析为命令和args

ken*_*dds 5 javascript regex string parsing

我需要解析用于交叉生成的字符串

从以下字符串:

cmd foo bar
cmd "foo bar" --baz boom
cmd "baz \"boo\" bam"
cmd "foo 'bar bud' jim" jam
FOO=bar cmd baz
Run Code Online (Sandbox Code Playgroud)

对象:

{command: 'cmd', args: ['foo', 'bar']}
{command: 'cmd', args: ['foo bar', '--baz', 'boom']}
{command: 'cmd', args: ['baz "boo" bam']}
{command: 'cmd', args: ['foo \'bar bud\' jim', 'jam']}
{command: 'cmd', args: ['baz'], env: {FOO: 'bar'}}
Run Code Online (Sandbox Code Playgroud)

我认为正则表达式是可能的,但我希望避免写一些自定义的东西.有人知道有什么可以做到这一点吗?

编辑

问题和答案仍然很有价值,但对于我的具体用例,我不再需要这样做.我将使用spawn-command(更确切地说,我将使用spawn-command-with-kill),它不需要commandargs分开.这将使我的生活更轻松.谢谢!

Jed*_*son 4

可以使用正则表达式自行推出,但我强烈建议您查看以下任一内容:

两者都身经百战且得到良好支持;minimist 每月的下载量约为 3000 万次,而 yargs 的下载量接近一半。

您很可能可以找到一种方法来使用其中一种来获得您想要的 CLI 语法,但envIMO 应该单独处理的支持除外(我无法想象您为什么要对环境变量有意见)被设置为命令的一部分)

  • 因此,更清楚地说,我正在研究 [`ps`](https://github.com/kentcdodds/ps),它允许您指定命令字符串,并将其作为子进程调用。使用“cross-spawn”,您需要分别提供“command”和“args”。但是,如果我使用“spawn-command”,那么我就不必执行此操作(我可以只发送整个命令),这首先消除了我执行此操作的需要! (2认同)