我现在正在重写我的一个脚本,遇到一个我无法解决的问题。 command是一个输入变量,现在我运行了此测试(两个正则表达式都相同):

var parts = command.match(/([^\s"]+(?=\s*|$))|(".+?")/g);
console.log(command === "view -10 10 -10 10");
console.log(parts);
console.log(String("view -10 10 -10 10").match(/([^\s"]+(?=\s*|$))|(".+?")/g));


控制台现在说

true
[]
["view", "-10", "10", "-10", "10"]


这完全使我感到困惑。为什么即使使用command===等于我的测试字符串,也不会以相同的方式分开?

最佳答案

从OP

这是整个问题的解决方案:
该程序的基本结构如下

while (<condition>) {
    var command = getNextCommand();

    var parts = command.match(/([^\s"]+(?=\s*|$))|(".+?")/g);
    processParts(parts);
}


其中processParts()操纵了参数:

function processParts(parts) {
    var foo = parts.shift();
    doSomethingElse(foo);
}


这导致主例程中的parts缩小,并且在我的代码processParts中实际上shift了所有元素,导致console.log(parts)在记录延迟时写入了一个空数组(请参阅dystroy的评论)。

最重要的是,我的processParts()函数有一个我没有注意到的错误,这就是我将空parts归咎于此的原因。解决了该错误后,由于我不再需要parts了,上面的代码再次起作用了,并且可以将其缩小。总的来说,您可能想提防这一点,尽管... JavaScript会做一些奇怪的事情。

07-24 14:35