5

最終的に私はこれを変えようとしています:

var msg = '-m "this is a message" --echo "another message" test arg';

これに:

[
    '-m',
    'this is a message',
    '--echo',
    'another message',
    'test',
    'arg'
]

文字列を解析して目的の結果を得る方法がよくわかりません。これは私がこれまでに持っているものです:

var msg = '-m "this is a message" --echo "another message" test arg';

// remove spaces from all quoted strings.
msg = msg.replace(/"[^"]*"/g, function (match) {
    return match.replace(/ /g, '{space}');
});

// Now turn it into an array.
var msgArray = msg.split(' ').forEach(function (item) {
    item = item.replace('{space}', ' ');
});

それはうまくいくと思いますが、私が望むことを達成するための気まぐれで後ろ向きな方法のように思えます。分割前にプレースホルダー文字列を作成するよりもはるかに良い方法があると確信しています。

4

3 に答える 3

5

exec() を使用すると、引用符なしで文字列を取得できます。

var test="once \"upon a time\"  there was   a  \"monster\" blue";

function parseString(str) {
    var re = /(?:")([^"]+)(?:")|([^\s"]+)(?=\s+|$)/g;
    var res=[], arr=null;
    while (arr = re.exec(str)) { res.push(arr[1] ? arr[1] : arr[0]); }
    return res;
}

var parseRes= parseString(test);
// parseRes now contains what you seek
于 2013-03-14T23:13:37.373 に答える
4

の代わりにsplit、次のことができmatchます。

var msg = '-m "this is a message" --echo "another message" test arg';
var array = msg.match(/"[^"]*"|[^\s"]+/g);
console.log(array);

生成:

[ '-m',
  '"これはメッセージです"',
  ' - エコー'、
  '"別のメッセージ"',
  'テスト'、
  '引数' ]
于 2013-03-14T21:46:14.510 に答える
1

解決策として何を好むかを推測するのは困難ですが、1 つの方法として、引用符で分割し (ネストされた引用符がないことを前提としています)、すべての代替アイテムをスペースで分割します。

result = [];
msg.split("\"").map(function(v, i ,a){
    if(i % 2 == 0) {
        result = result.concat(v.split(" ").filter(function(v){
            return !v;
        }));
    } else {
        result.push(v);
    }
});

ここにデモンストレーションがあります: http://jsfiddle.net/eL7cc/

于 2013-03-14T21:40:54.477 に答える