【问题标题】:Split string by multiple delimiters, keep them and ignore them in double quotes通过多个分隔符拆分字符串,保留它们并在双引号中忽略它们
【发布时间】:2016-11-01 08:50:19
【问题描述】:

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

动机

我有一个JScriptWSH 下运行。但是,这本质上是一个简单的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

【问题讨论】:

  • 那么转义引号 (\\") 呢?
  • 似乎Amadan 解决方案在这种情况下效果很好
  • 试试str.match(/"(?:\\[\s\S]|[^"])*"|[-=]|[^-="\s][^-="]*/g)
  • @ndn:确实我的代码不会正确对待它们。它属于我的免责声明(更多测试字符串 = 更好的要求 = 更少奇怪的极端情况错误)。

标签: javascript regex split jscript wsh


【解决方案1】:

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

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

【讨论】:

  • 在这种情况下没有必要滥用replace()。使用res = str.match(regex); 和imo [^-="\s]+(?:\s[^-="]+)? 有点太具体了我会使用[^-="\s](?:[^-="]*[^-="\s])? 基本上是[^-="]+trim()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多