将字符串解析为类似命令行的数组

时间:2016-05-27 04:57:17

标签: javascript arrays node.js string

我正在与Node制作交互式应用程序(显然)需要用户输入。我有那么多工作,但有些输入有空格,.split(' ')调用会搞乱。

正在发生的事情的例子:

> foo "hello world" bar
['foo','"hello','world"','bar']

我想要发生什么:

> foo "hello world" bar
['foo','hello world','bar']

我试过寻找一个npm包,但没有运气。

编辑:我知道我可以使用正则表达式,但我不知道正确的序列是什么。

2 个答案:

答案 0 :(得分:3)

您可以使用 match()

console.log(
  'foo "hello world" bar'.match(/"[^"]+"|\w+/g)
)

Regex explanation here

Regular expression visualization

如果您想避免使用",请将捕获的群组正则表达式与 exec()

一起使用

var str = 'foo "hello world" bar';
var reg = /"([^"]+)"|\w+/g,
  m, res = [];

while (m = reg.exec(str))
  res.push(m[1] || m[0])

console.log(res);

Regex explanation here

Regular expression visualization

答案 1 :(得分:-1)

如果你不想使用正则表达式,你可能会喜欢

'foo "hello world" bar'.replace('"',"").split(" ");

或确保包含单引号输入案例,您可以使用简单的正则表达式,如下所示

console.log('foo "hello world" bar'.replace(/("|')/g,"").split(" "));

好吧,这是我对正则表达式的修正。这个只会捕获引号之间的文本,不包括引号而不使用任何捕获组。由于我们不使用任何捕获组,因此可以使用简单的String.prototype.match()方法一次性解析所需的键数组,而无需循环。

[^"]+(?="(\s|$))|\w+

Regular expression visualization

Debuggex Demo

var reg = /[^"]+(?="(\s|$))|\w+/g,
    str = 'baz foo "hello world" bar whatever',
    arr = str.match(reg);
console.log(arr);