如何在JavaScript中按空格拆分字符串,但排除出现在“引号”之间的空格?

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

我认为那会起作用,但是那看起来像是一种靠运气且不切实际的方法来达到我的目的。我相信你们有比在分割之前创建占位符字符串更好的方法。


在正则表达式中使用嵌套引号可能不是最好的选择,递归与正则表达式并不兼容。 - elclanrs
1
你可以通过引号进行分割,然后再分割每个交替项。 - Asad Saeeduddin
我不允许嵌套引号,这就是为什么我排除了带有引号的匹配 [^"]*,否则该表达式将匹配第一个和最后一个引号之间的整个字符串。 - Chev
1
我很惊讶地发现这个问题被标记为重复,但它所重复的问题并没有答案。那么,它是不是一个重复的问题呢? - GameAlchemist
1
是的,我不认为我的问题是链接中的重复,但没关系。 - Chev
显示剩余2条评论
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

谢谢您。我一直在想是否有更好的方法可以获取没有引号的引用值,但是我不想过于苛求并拖延这个问题。这正是我想要的。 - Chev

4

你可以使用 match 来代替 split

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

生成:

[ '-m',
  '"这是一条消息"',
  '--echo',
  '"另一条消息"',
  '测试',
  '参数' ]

简单多了。谢谢。 - Chev
3
由于双引号在期望的输出中不存在,因此您可能还希望从最终数组中过滤掉双引号。 - Asad Saeeduddin

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/


这至少比使用占位符字符串要好 :) - Chev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接