我需要按管道字符拆分文字但如果它在单引号或双引号字符串的中间不应拆分,考虑到报价可以转义,如果管道是转义为od斜线数,测试用例:
输入:" foo bar |巴兹" otuput:[" foo bar"," baz"]
输入:' foo" bar" |巴兹' 输出:[' foo" bar"'," baz"]
输入:" foo' bar \' |巴兹'" 输出:[" foo' bar \' |巴兹'"]
输入:" foo' bar \\' |巴兹" 输出:[" foo' bar \\'"," baz"]
输入:" foo' bar \\' \ |巴兹" 输出[" foo' bar \\' \ |巴兹"]
在php中我有这个正则表达式:
const separators = "/(?:\"[^\"\\\\]*(?:\\\\[\S\s][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[\S\s][^'\\\\]*)*')(*SKIP)(*F)|(\s+(?:&&|\|{1,2}|;)\s+)/";
但是javascript没有(*SKIP)
因此可能无法使用正则表达式并且使用解析器生成器创建解析器是过度的,通过创建小函数应该是一件容易的事。
答案 0 :(得分:0)
我创建了解析字符串的小函数:
function split(string) {
var output = [];
var quote = false;
var start = 0;
function is_escaped() {
return string.substring(start, i).match(/(\\\\)*\\$/);
}
for (var i = 0; i < string.length; ++i) {
if (string[i] === '"' || string[i] === "'") {
if (!is_escaped()) {
quote = !quote;
}
} else if (string[i] === '|' && !quote) {
if (!is_escaped()) {
output.push(string.substring(start, i));
start = i + 1;
}
}
if (i == string.length - 1) {
output.push(string.substring(start));
}
}
return output.map(function(string) {
return string.replace(/^\s+|\s+$/g, '');
});
}