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

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

本文关键字:分隔 分隔符 字符串 保留      更新时间:2023-09-26

我知道这个问题以前已经问过很多次了,但我似乎无法将所有数据合并到一个工作解决方案

动机

我有一个运行在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循环)。我挑出来了:

  • 引用字符串
  • 破折号
  • =
  • 不适合上述
  • 的字符串

如果" "是一个有效的东西,那么第四组将更容易一些,但是您需要额外努力来取消普通空格的资格…

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

编辑:措辞,并简化正则表达式

EDIT2: for @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);