JS string.split()没有删除分隔符

时间:2010-12-22 22:03:18

标签: javascript split delimiter

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

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

当我这样做的时候 var newstring = string.split("d"),我得到这样的话:

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

但我希望得到这个:

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

当我尝试做我的“split2”功能时,我把所有纠结在splice()和索引以及“this”vs“that”和...... aargh!救命! :d

12 个答案:

答案 0 :(得分:46)

尝试:

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

答案 1 :(得分:19)

试试这个:

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

    希望这有帮助。

答案 2 :(得分:18)

var parts= string.split('d');
for (var i= parts.length; i-->1;)
    parts.splice(i, 0, 'd');

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

答案 3 :(得分:15)

我喜欢Kai's answer,但它不完整。而是使用:

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

这在正则表达式中使用Lookahead Zero-Length Assertion,这使匹配不属于捕获组。不需要其他技巧或变通方法。

答案 4 :(得分:8)

可以在一行中完成:

var string = "abcdeabcde";    
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]

答案 5 :(得分:5)

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对象”。

答案 6 :(得分:2)

这是我的regexp分隔符版本。它与String.prototype.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));
}

答案 7 :(得分:1)

试试这个:

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

答案 8 :(得分:1)

试试这个

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

答案 9 :(得分:0)

function split2(original){
   var delimiter = "d", result = [], tmp;
   tmp = original.split(delimiter);
   tmp.forEach(function(x){result.push(x); result.push(delimiter); });
   return result;
}

答案 10 :(得分:0)

只需使用以下功能覆盖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替换插入函数),则分隔符不能是正则表达式。但是如果你考虑一下,这不是一个真正的限制,因为如果使用正则表达式你不需要第二个参数......

答案 11 :(得分:0)

试试这个

var string = "abcdeabcde";
var res = string.replace( /d/g, 'd\0' ).split(/(?=d)|\0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]