拆分所有未转义的分号

时间:2012-10-16 17:08:23

标签: javascript regex

我有一个包含分号的javascript-string(其中一些是转义的)。

我的问题是,如何在所有未转义的分号上拆分此字符串并保留转义的分号

var example = "abc;def;ghi\;jk"

这应该得到:

example[0] = "abc";
example[1] = "def";
example[2] = "ghi\;jk";

我只发现了一个PHP-regex,它在javascript中不起作用:(

'/(?<!\\\);/'

任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:8)

JavaScript没有负面的后视(这会使这个问题变得简单),所以我们可以通过反转字符串并使用负面预测来模拟它!

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"]

答案 1 :(得分:2)

以下经过测试的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'];