Подтвердить что ты не робот

JS string.split() без удаления разделителей

Как я могу разделить строку без удаления разделителей?

Скажем, у меня есть строка: var string = "abcdeabcde";

Когда я var newstring = string.split("d"), я получаю что-то вроде этого:

["abc","eabc","e"]

Но я хочу получить следующее:

["abc","d","eabc","d","e"]

Когда я попытался выполнить свою функцию "split2", я получил все запутанные в splice() и индексы и "this" vs "that" и... aargh! Помогите!: D

4b9b3361

Ответ 1

Попробуйте следующее:

  • Заменить все экземпляры "d" на ", d"
  • Разделить на ","
var string = "abcdeabcde";
var newstringreplaced = string.replace(/d/gi, ",d");
var newstring = newstringreplaced.split(",");
return newstring;

Надеюсь, что это поможет.

Ответ 2

Try:

"abcdeabcde".split(/(d)/);

Ответ 3

var parts= string.split('d');
for (var i= parts.length; i-->1;)
    parts.splice(i, 0, 'd');

(Обратный цикл необходим, чтобы не добавлять d к частям списка, которые уже были вставлены d.)

Ответ 4

Мне нравится Ответ Кай, но он неполный. Вместо этого используйте:

"abcdeabcde".split(/(?=d)/g) //-> ["abc", "deabc", "de"]

В regex используется Утверждение длины нуля Lookahead, что делает совпадение не частью группы захвата. Никаких других трюков или обходных решений не требуется.

Ответ 5

Можно сделать в одной строке:

var string = "abcdeabcde";    
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]

Ответ 6

split - split используется для создания отдельных строк, не предназначенных для поиска.

[^ d] - найдите группу подстрок, не содержащих "d"

var str = "abcdeabcde";

str.match(/[^d]+|d/g)         // ["abc", "d", "eabc", "d", "e"]
or
str.match(/[^d]+/g)           // ["abc", "eabc", "e"]
or
str.match(/[^d]*/g)           // ["abc", "", "eabc", "", "e", ""]

Прочитайте "RegExp Object", если вам не нужны проблемы с "javascript".

Ответ 7

Это моя версия для разделителей регулярных выражений. Он имеет тот же интерфейс с String.prototype.split; он будет рассматривать глобальное и не глобальное регулярное выражение без разницы. Возвращаемое значение - это массив, в котором нечетным его членом являются сопоставленные разделители.

function split(text, regex) {
    var token, index, result = [];
    while (text !== '') {
        regex.lastIndex = 0;
        token = regex.exec(text);
        if (token === null) {
            break;
        }
        index = token.index;
        if (token[0].length === 0) {
            index = 1;
        }
        result.push(text.substr(0, index));
        result.push(token[0]);
        index = index + token[0].length;
        text = text.slice(index);
    }
    result.push(text);
    return result;
}

// Tests
assertEquals(split("abcdeabcde", /d/), ["abc", "d", "eabc", "d", "e"]);
assertEquals(split("abcdeabcde", /d/g), ["abc", "d", "eabc", "d", "e"]);
assertEquals(split("1.2,3...4,5", /[,\.]/), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]+/), ["1", ".", "2", ",", "3", "...", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]*/), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", ""]);
assertEquals(split("1.2,3...4,5", /[,\.]/g), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]+/g), ["1", ".", "2", ",", "3", "...", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]*/g), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]/), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]+/), ["1", ".", "2", ",", "3", "...", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]*/), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", "", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]/g), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]+/g), ["1", ".", "2", ",", "3", "...", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]*/g), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", "", ".", ""]);

// quick and dirty assert check
function assertEquals(actual, expected) {
  console.log(JSON.stringify(actual) === JSON.stringify(expected));
}

Ответ 8

Попробуйте следующее:

var string = "abcdeabcde";
    var delim = "d";
    var newstring = string.split(delim);
    var newArr = [];
    var len=newstring.length;
    for(i=0; i<len;i++)
    {
        newArr.push(newstring[i]);
        if(i != len-1)newArr.push(delim);
    }

Ответ 9

Попробуйте это

"abcdeabcde".split("d").reduce((result, value, index) => {
    return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])

Ответ 10

function split2(original){
   var delimiter = "d", result = [], tmp;
   tmp = original.split(delimiter);
   tmp.forEach(function(x){result.push(x); result.push(delimiter); });
   return result;
}

Ответ 11

Просто переопределите функцию String.prototype.split следующим образом:

String.prototype._split = String.prototype.split;
String.prototype.split = function(delimiter, keepDelimiters) {
    if (!keepDelimiters) {
        return this._split(delimiter);
    } else {
        var res = [];
        var start = 0, index;
        while ((index = this.indexOf(delimiter, start)) != -1) {
            res.push(this.substr(start, index - start));
            res.push(delimiter);
            start = index + 1;
        }
        res.push(this.substr(start));
        return res;
    }
};


var str = "abcdeabcde";
alert(str.split("d", true));
alert(str.split("d"));

// output : 
//
//  [ 'abc', 'd', 'eabc', 'd', 'e' ]
//  [ 'abc', 'eabc', 'e' ]

Этот метод не будет работать, не используйте регулярные выражения и согласуется с исходной функцией String.split. Он также согласуется с решением str.split(/(d)/);, но не будет работать в IE.

Единственное ограничение состоит в том, что, если используется второй параметр (функция отбрасывания замены split), разделитель не может быть регулярным выражением. Но если вы думаете об этом немного, это не настоящее ограничение, так как вам не нужен второй параметр, если вы используете регулярное выражение...

Ответ 12

Попробуйте это

var string = "abcdeabcde";
var res = string.replace( /d/g, 'd\0' ).split(/(?=d)|\0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]