JS string.split()不删除分隔符
如何拆分string而不删除分隔符?
比方说,我有一个string: var string = "abcdeabcde";
当我做var newstring = string.split("d")
,我得到这样的东西:
["abc","eabc","e"]
但我想得到这个:
["abc","d","eabc","d","e"]
当我试图做我的“split2”function时,我全都纠缠在拼接()和索引,“这个”与“那个”,… …! 帮帮我! :d
尝试这个:
- 将所有“d”实例replace为“,d”
- 按“,”拆分
var string = "abcdeabcde"; var newstringreplaced = string.replace(/d/gi, ",d"); var newstring = newstringreplaced.split(","); return newstring;
希望这可以帮助。
尝试:
"abcdeabcde".split(/(d)/);
var parts= string.split('d'); for (var i= parts.length; i-->1;) parts.splice(i, 0, 'd');
(反向循环是必要的,以避免将d
s添加到已经插入的部分列表中。)
可以在一行中完成:
var string = "abcdeabcde"; string.split(/(d)/); ["abc", "d", "eabc", "d", "e"]
拆分 – 拆分用于创build单独的行而不用于search。
[^ d] – find一组不包含“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”的问题。
我喜欢Kai的回答 ,但是不完整。 而是使用:
"abcdeabcde".split(/(?=d)/g) //-> ["abc", "deabc", "de"]
这在正则expression式中使用了一个Lookahead零长度声明 ,这使得匹配不是捕获组的一部分。 没有其他的技巧或解决方法需要。
这是我的正则expression式分隔符的版本。 它与String.prototype.split具有相同的接口; 它将对待全球和非全球正则expression式没有区别。 返回值是一个奇数成员匹配分隔符的数组。
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' ]
这种方法不会失败,不要使用正则expression式,并且与原始的String.split
函数一致。 这也符合str.split(/(d)/);
解决scheme,但不会在IE中失败。
唯一的限制是,如果使用第二个参数( split
replace插入函数),则分隔符不能是正则expression式。 但是如果你仔细想一下,这不是一个真正的限制,因为如果使用正则expression式,你不需要第二个参数。
尝试这个
"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\0' ).split(/(?=d)|\0/); console.log( res ); //["abc", "d", "eabc", "d", "e"]