2016-05-27 95 views
0

我正在與Node(顯然)需要用戶輸入的交互式應用程序。我有這麼多的工作,但一些輸入有空格,一個.split(' ')電話會攪亂。發生了什麼事的解析字符串到類似命令行的數組

例子:

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

我希望發生什麼:

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

我試圖尋找一個NPM包,但還沒有任何運氣。

編輯:我知道我可以使用正則表達式,但我不知道什麼是正確的序列。

回答

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

如果你不想使用正則表達式,你可以像

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

+0

這個輸出正是我想避免 – Valkyrie

+0

@Emillia對不起我的壞。糾正的代碼附在誤導性的下面。再次抱歉。 – Redu