Javascript JS string.split()而不删除分隔符
如何在不删除分隔符的情况下拆分字符串 假设我有一个字符串:Javascript JS string.split()而不删除分隔符,javascript,split,delimiter,Javascript,Split,Delimiter,如何在不删除分隔符的情况下拆分字符串 假设我有一个字符串: var string=“abcdeabcde” 当我这样做的时候 var newstring=string.split(“d”),我得到如下结果: [“abc”、“eabc”、“e”] 但我想得到这个: [“abc”、“d”、“eabc”、“d”、“e”] 当我尝试执行“split2”函数时,我被splice()和索引以及“this”vs“that”和。。。啊!救命啊试试这个: var string = "abcdeabcde";
var string=“abcdeabcde”代码>
当我这样做的时候
var newstring=string.split(“d”)
,我得到如下结果:
[“abc”、“eabc”、“e”]
但我想得到这个:
[“abc”、“d”、“eabc”、“d”、“e”]
当我尝试执行“split2”函数时,我被splice()和索引以及“this”vs“that”和。。。啊!救命啊试试这个:
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);
}
将所有“d”实例替换为“d”
除以“,”
希望这有帮助。试试这个:
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);
}
var string=“abcdeabcde”;
var delim=“d”;
var newstring=string.split(delim);
var newArr=[];
var len=newstring.length;
对于(i=0;i尝试:
只需使用以下函数覆盖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
replacement下拉函数),则分隔符不能是正则表达式。但是如果您稍微考虑一下,它不是真正的限制,因为如果使用正则表达式,您不需要第二个参数…试试这个
var string = "abcdeabcde";
var res = string.replace( /d/g, 'd\0' ).split(/(?=d)|\0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]
"abcdeabcde".split("d").reduce((result, value, index) => {
return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
(必须使用反向循环,以避免将d
s添加到已插入d
s的列表部分。)split-split用于创建不用于搜索的单独行
[^d]-查找不包含“d”的子字符串组
如果您不希望“javascript”出现问题,请阅读“RegExp对象”。这是我的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));
}
可以在一行中完成:
var string = "abcdeabcde";
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]
我喜欢,但它不完整。请使用:
"abcdeabcde".split(/(?=d)/g) //-> ["abc", "deabc", "de"]
这是在使用in-regex,这使得匹配不属于捕获组。不需要其他技巧或解决方法。试试这个
var string = "abcdeabcde";
var res = string.replace( /d/g, 'd\0' ).split(/(?=d)|\0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]
"abcdeabcde".split("d").reduce((result, value, index) => {
return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
根据firebugs Profile的最快答案您的解决方案有一个错误-当我将实例替换为“d”而不是“d”时,它会起作用。好主意!因为简单而接受:)“abcdeabcde”。split(/(d)/);对于原始字符串中的任何,
都失败。b是的,我想如果原始字符串中的某处包含“,”是不安全的。但我喜欢这个原则。注意,这在IE中不起作用,因为JScript bug。OP没有指定环境是否是浏览器,哪个IE不起作用?@MikeAono:,通过使用regex/(?=d)/g
这应该是公认的答案:它更简单、更安全,最近,IE很少成为一项要求+1比公认的答案安全得多。另外一项要求是使用-->
运算符:d这比公认的答案更好,比重新设置或替换为可能自然出现此答案的特殊字符更好。不过,我很高兴再次将…+1用于此功能!没问题。我试着让它更清楚一点。如果我犯了错误,请随时回滚或编辑。全局对象更改会影响速度。方法“RegExp”-通用且快速。如果代码较大,则更容易理解代码。这是我的观点。这个解决方案已经发布了。如果我希望结果是[“abc”,“deabc”,“de”]?@Mike Aono-拆分不是这样的。您可以在“c”之后或“d”之前添加某种分隔符。如下所示:var string=“abcdeabcde”;string=string.replace(/d/gi,“,d”);string.split(“,”)@MikeAono:,通过使用regex/(?=d)/g
-1你不敢碰任何*。原型
!好吧,只是提醒大家这个答案已经有6年历史了,原型不是什么神圣的东西,支持他们。现在每个人都可以冷静下来了。嗯,是。。看那篇文章的日期不,不是。当时,普遍的共识是避免扩展原型,因为很多人仍在使用(2017年仍有少数人使用)。出于这个原因,我提出了这个解决方案,因为它与原始的String.prototype.split
兼容。当然,如果另一个库或代码覆盖它,它可能会停止工作,这就是扩展原型成为禁忌的原因。实际上,只要代码库很小,它就没有问题。问题没有指定这一点。库和第三方代码不应覆盖任何JavaScript原型,但这一限制只是对用户代码的建议。@ruffin它没有标记,但有相同的注释指向后面。它们都被认为是彼此的副本-我们应该以某种方式决定关闭哪一个:)有没有解决方案可以得到这个结果://->[“abcd”,“eabcd”,“e”]@forresst不需要一个拆分命令,好的。但奇怪的是,公认的答案几乎可以做到这一点,除了使用前导分隔符而不是尾随分隔符。
"abcdeabcde".split(/(?=d)/g) //-> ["abc", "deabc", "de"]
"abcdeabcde".split("d").reduce((result, value, index) => {
return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])