В JS строку.split () без удаления разделителей
как я могу разделить строку без удаления разделителей?
допустим, у меня есть строка:
var string = "abcdeabcde";
когда я делаю
var newstring = string.split("d")
, Я получаю что-то вроде этого:
["abc","eabc","e"]
но я хочу получить это:
["abc","d","eabc","d","e"]
когда я попытался сделать свою функцию "split2", я запутался в splice() и индексах и" этом "против" того "и"... арагх! Помогите! : D
12 ответов
попробуйте это:
- замените все экземпляры" d "на", d"
- разделить на ","
var string = "abcdeabcde";
var newstringreplaced = string.replace(/d/gi, ",d");
var newstring = newstringreplaced.split(",");
return newstring;
надеюсь, что это помогает.
var parts= string.split('d');
for (var i= parts.length; i-->1;)
parts.splice(i, 0, 'd');
(обратный цикл необходим, чтобы избежать добавления d
s к частям списка, которые уже имели d
s вставлено.)
Мне нравится Кай, но он не закончен. Вместо этого используйте:
"abcdeabcde".split(/(?=d)/g) //-> ["abc", "deabc", "de"]
это использование Lookahead Утверждение Нулевой Длины в регулярном выражении, что делает совпадение не частью группы захвата. Никаких других уловок или обходных путей не требовалось.
можно сделать в одну строку:
var string = "abcdeabcde";
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]
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", если вы не хотите проблем с"javascript".
Это моя версия для выражения разделители. Он имеет тот же интерфейс со строкой.прототип.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));
}
попробуйте это:
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);
}
просто переопределить 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' ]
этот метод не потерпит неудачу, не используйте регулярные выражения и согласуется с исходным
попробуй такое
"abcdeabcde".split("d").reduce((result, value, index) => {
return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
function split2(original){
var delimiter = "d", result = [], tmp;
tmp = original.split(delimiter);
tmp.forEach(function(x){result.push(x); result.push(delimiter); });
return result;
}
попробуй такое
var string = "abcdeabcde";
var res = string.replace( /d/g, 'd' ).split(/(?=d)|/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]