Split()而不删除分隔符

如何在不删除分隔符的情况下拆分字符串?

假设我有一个字符串: var string = "abcdeabcde";

等我找到的时候 var newstring = string.split("d"),我得到这样的东西:

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

但我想知道:

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

当我尝试执行“ split2”函数时,我陷入了 splice ()和索引以及“ this”和“ that”的纠缠中,还有... ... 啊!救命啊!校对: D

67348 次浏览

试试这个:

  1. 将所有“ d”实例替换为“ ,d”
  2. 一分为二
var string = "abcdeabcde";
var newstringreplaced = string.replace(/d/gi, ",d");
var newstring = newstringreplaced.split(",");
return newstring;

希望这个能帮上忙。

试试这个:

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);
}
function split2(original){
var delimiter = "d", result = [], tmp;
tmp = original.split(delimiter);
tmp.forEach(function(x){result.push(x); result.push(delimiter); });
return result;
}

试试:

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

试试这个

var string = "abcdeabcde";
var res = string.replace( /d/g, 'd\0' ).split(/(?=d)|\0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]
var parts= string.split('d');
for (var i= parts.length; i-->1;)
parts.splice(i, 0, 'd');

(反向循环是必要的,以避免将 d添加到已经插入了 d的列表部分。)

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

如果您不希望“ javascript”出现问题,请阅读“ RegExp Object”。

这是用于 regexp 分隔符的版本。它与 String.Prototype.split 有相同的接口; 它对全局和非全局 regexp 没有区别。返回值是一个数组,它的奇数成员是匹配的分隔符。

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));
}

我喜欢 Kai 的回答,但它是不完整的。代替使用:

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

这是在正则表达式中使用 前瞻性零长度断言,这使得匹配不属于捕获组。不需要其他技巧或变通方法。

试试这个

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