用多个分隔符拆分字符串,保留它们并在双引号中忽略它们

Split string by multiple delimiters, keep them and ignore them in double quotes

我知道这个问题以前曾以多种形式被问过,但我似乎无法将所有数据合并到一个有效的解决方案中

动机

我在WSH下面有一个JScript运行。然而,这本质上是一个简单的 javascript | regexp 问题

我正在尝试解析一个字符串。要求:

  1. 用多个分隔符分割:-=
  2. 忽略双引号中的分隔符
  3. 保留结果中的分隔符

例子

这是我一直在使用的字符串。双引号是字符串的一部分

"C:\Users\u 1\a-b\f1.txt" -CONFIG="C:\Users\u 1\c=d\f2.xfg"-ARGS=/quite /v1

拆分后的预期结果

  1. "C:\Users\u 1\a-b\f1.txt"
  2. -
  3. CONFIG
  4. =
  5. "C:\Users\u 1\c=d\f2.xfg"
  6. -
  7. ARGS
  8. =
  9. /quite /v1

尝试失败

var str = '"C:\Users\u 1\a-b\f1.txt" -CONFIG="C:\Users\u 1\c=d\f2.xfg"-ARGS=/quite /v1';
var res = str .split(/-(?=(?:(?:[^"]*"){2})*[^"]*$)/);

失败的结果:

  1. \"C:\Users\u 1\a-b\f1.txt
  2. CONFIG=\"C:\Users\u 1\c=d\f2.xfg\"
  3. ARGS=/quite /v1

这是一件很奇怪的事情...但是这里有...

var str = '"C:\Users\u 1\a-b\f1.txt" -CONFIG="C:\Users\u 1\c=d\f2.xfg"-ARGS=/quite /v1';
var res = [];
str.replace(/".*?"|-|=|[^-="\s]+(?:\s[^-="]+)?/g, function(m) { res.push(m); });
console.log(res);

split 使用起来很棘手,因为您需要定义您 想要的东西;找到所有匹配项更好(在 JavaScript 中,replace 是最简单的方法 - 另一种是 exec loop)。我正在挑选:

  • 带引号的字符串
  • 破折号
  • 等于
  • 以上不符合的字符串

如果 " " 是一个有效的选择,第四组会更容易一些,但是你需要更加努力地工作才能取消普通空格的资格...

也就是说,您只有一个示例,因此它很可能会与其他未经测试的输入中断。

编辑:正则表达式的措辞和简化

EDIT2:对于@ndn,一个处理\n:

的版本

var str = '"C:\Users\u 1\a-b\f1.txt" -CONFIG="C:\Users\u\"3\"\c=d\f2.xfg"-ARGS=/quite /v1';
var res = [];
str.replace(/"(?:\"|[^"])*"|-|=|[^-="\s]+(?:\s[^-="]+)?/g, function(m) { res.push(m); });
console.log(res);