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)
    }, [])