我有一个包含分号的 javascript 字符串(其中一些被转义)。
我的问题是,如何在所有未转义的分号上拆分此字符串并保留转义的分号
var example = "abc;def;ghi\;jk"
这应该得到:
example[0] = "abc";
example[1] = "def";
example[2] = "ghi\;jk";
我只找到了一个 PHP 正则表达式,它在 javascript 中不起作用:(
'/(?<!\\\);/'
任何想法如何做到这一点?
我有一个包含分号的 javascript 字符串(其中一些被转义)。
我的问题是,如何在所有未转义的分号上拆分此字符串并保留转义的分号
var example = "abc;def;ghi\;jk"
这应该得到:
example[0] = "abc";
example[1] = "def";
example[2] = "ghi\;jk";
我只找到了一个 PHP 正则表达式,它在 javascript 中不起作用:(
'/(?<!\\\);/'
任何想法如何做到这一点?
JavaScript 没有否定的look-behind(这会使这个问题变得简单),所以我们可以通过反转字符串并使用否定的look-ahead 来模拟它!
function splitByUnescapedSemicolons(s) {
var rev = s.split('').reverse().join('');
return rev.split(/;(?=[^\\])/g).reverse().map(function(x) {
return x.split('').reverse().join('');
});
}
splitByUnescapedSemicolons("abc;def;ghi\;jk"); // => ["abc", "def", "ghi\;jk"]
以下经过测试的 JavaScript 函数可以解决问题:
function splitByUnescapedSemicolons(text) {
var a = []; // Array to receive results.
if (text === '') return a; // Special empty string case.
// Push first (possibly last) value.
text = text.replace(/^[^;\\]*(?:\\[\S\s][^;\\]*)*(?=;|$)/,
function(m0){a.push(m0); return '';});
// Push any 2nd, 3rd, remaining values.
text = text.replace(/;([^;\\]*(?:\\[\S\s][^;\\]*)*)/g,
function(m0, m1){a.push(m1); return '';});
return a;
}
该解决方案正确处理转义的分号(并且也转义了其他任何内容,包括转义转义)。
"" == [];
";" == ['', ''];
"\;" == ['\;'];
"\\;" == ['\\', ''];
"one;two" == ['one', 'two'];
"abc;def;ghi\;jk" == ['abc', 'def', 'ghi\;jk'];
"abc;def;ghi\\;jk" == ['abc', 'def', 'ghi\\', 'jk'];