4

セミコロンを含む javascript-string があります (一部はエスケープされています)。

私の問題は、この文字列をエスケープされていないすべてのセミコロンで分割し、エスケープされたものを残す方法です

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

これは次のようになります。

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

javascriptで機能しないPHP正規表現のみを見つけました:(

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

これを行う方法はありますか?

4

2 に答える 2

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"]
于 2012-10-16T17:25:23.377 に答える
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'];
于 2012-10-16T20:01:40.470 に答える