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

时间:2016-11-01 08:50:20

标签: javascript regex split jscript wsh

我知道此问题之前曾在多种变体中被问过,但我似乎无法将所有数据合并到一个可行的解决方案

动机

我在JScript下运行WSH。但是,这基本上是一个简单的javascript | regexp问题

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

  1. 按多个分隔符拆分:-=
  2. 忽略用双引号括起来的分隔符
  3. 在结果中保留分隔符
  4. 实施例

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

    的一部分
    "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
    10. 尝试失败

      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

1 个答案:

答案 0 :(得分:3)

这需要一个奇怪的事情......但是这里......

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