как разбить строку в JS с некоторыми исключениями - PullRequest
12 голосов
/ 07 сентября 2011

У меня есть эта строка:

a\,bcde,fgh,ijk\,lmno,pqrst\,uv

Мне нужна функция JavaScript, которая будет разбивать строку на каждые ,, но только те, которые не имеют \ перед ними

Как это можно сделать?

Ответы [ 5 ]

11 голосов
/ 07 сентября 2011

Вот самое короткое, что я могу придумать:

'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.replace(/([^\\]),/g, '$1\u000B').split('\u000B')

Идея состоит в том, чтобы найти все места, где запятая не имеет префикса с обратной косой чертой, заменить те строки, которые редко встречаются в ваших строках, а затем разделить на эту необычную строку. *

Обратите внимание, что обратная косая черта перед запятыми должна быть экранирована с помощью другой обратной косой черты. В противном случае javascript рассматривает форму \, как экранированную запятую и выдает из нее просто запятую! Другими словами, если вы не избежите обратной косой черты, javascript видит это: a\,bcde,fgh,ijk\,lmno,pqrst\,uv как a,bcde,fgh,ijk,lmno,pqrst,uv.

3 голосов
/ 07 сентября 2011

Поскольку регулярные выражения в JavaScript не поддерживают lookbehinds , я не собираюсь придумывать гигантский хак, чтобы имитировать это поведение. Вместо этого вы можете просто split() на всех запятых (,) и затем склеить части, которые не должны были быть разбиты в первую очередь.

Quick 'n' dirty демо :

var str = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.split(','), // Split on all commas
    out = []; // Output

for (var i = 0, j = str.length - 1; i < j; i++) { // Iterate all but last (last can never be glued to non-existing next)
    var curr = str[i]; // This piece
    if (curr.charAt(curr.length - 1) == '\\') { // If ends with \ ...
        curr += ',' + str[++i]; // ... glue with next and skip next (increment i)
    }
    out.push(curr); // Add to output
}
1 голос
/ 07 сентября 2011

Еще один некрасивый хак из-за отсутствия наблюдателей:

<code>function rev(s) {
    return s.split('').reverse().join('');
}

var s = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv';

// Enter bizarro world...
var r = rev(s);

// Split with a look-ahead
var rparts = r.split(/,(?!\\)/);

// And put it back together with double reversing.
var sparts = [ ];
while(rparts.length)
    sparts.push(rev(rparts.pop()));

for(var i = 0; i < sparts.length; ++i)
    $('#out').append('<pre>' + sparts[i] + '
');

Демо: http://jsfiddle.net/ambiguous/QbBfw/1/

Я не думаю, что сделал бы это в реальной жизни, но это работает, даже если это заставляет меня чувствовать себя грязным. Считайте, что это любопытство, а не то, что вы действительно должны использовать.

0 голосов
/ 19 февраля 2016

В случае необходимости снимите также обратную косую черту:

var test='a\\.b.c';
var result = test.replace(/\\?\./g, function (t) { return t == '.' ? '\u000B' : '.'; }).split('\u000B');
//result: ["a.b", "c"]
0 голосов
/ 07 сентября 2011

Вы можете использовать регулярное выражение для разделения.

Вот ссылка на регулярное выражение в javascript http://www.w3schools.com/jsref/jsref_obj_regexp.asp

Вот ссылка на другой пост, где автор использовал регулярное выражение для разделения Javascript не будет разделяться с помощью регулярного выражения

Из первой ссылки, если вы заметили, вы можете создать регулярное выражение, используя

?! n Соответствует любой строке, за которой не следует определенная строка n

[,]!\\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...