用多个分隔符拆分字符串,保留它们并在双引号中忽略它们
Split string by multiple delimiters, keep them and ignore them in double quotes
我知道这个问题以前曾以多种形式被问过,但我似乎无法将所有数据合并到一个有效的解决方案中
动机
我在WSH
下面有一个JScript
运行。然而,这本质上是一个简单的 javascript
| regexp
问题
我正在尝试解析一个字符串。要求:
- 用多个分隔符分割:
-
、=
- 忽略双引号中的分隔符
- 保留结果中的分隔符
例子
这是我一直在使用的字符串。双引号是字符串的一部分
"C:\Users\u 1\a-b\f1.txt" -CONFIG="C:\Users\u 1\c=d\f2.xfg"-ARGS=/quite /v1
拆分后的预期结果
"C:\Users\u 1\a-b\f1.txt"
-
CONFIG
=
"C:\Users\u 1\c=d\f2.xfg"
-
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 .split(/-(?=(?:(?:[^"]*"){2})*[^"]*$)/);
失败的结果:
\"C:\Users\u 1\a-b\f1.txt
CONFIG=\"C:\Users\u 1\c=d\f2.xfg\"
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);
我知道这个问题以前曾以多种形式被问过,但我似乎无法将所有数据合并到一个有效的解决方案中
动机
我在WSH
下面有一个JScript
运行。然而,这本质上是一个简单的 javascript
| regexp
问题
我正在尝试解析一个字符串。要求:
- 用多个分隔符分割:
-
、=
- 忽略双引号中的分隔符
- 保留结果中的分隔符
例子
这是我一直在使用的字符串。双引号是字符串的一部分
"C:\Users\u 1\a-b\f1.txt" -CONFIG="C:\Users\u 1\c=d\f2.xfg"-ARGS=/quite /v1
拆分后的预期结果
"C:\Users\u 1\a-b\f1.txt"
-
CONFIG
=
"C:\Users\u 1\c=d\f2.xfg"
-
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 .split(/-(?=(?:(?:[^"]*"){2})*[^"]*$)/);
失败的结果:
\"C:\Users\u 1\a-b\f1.txt
CONFIG=\"C:\Users\u 1\c=d\f2.xfg\"
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);