Js string.split() sans enlever les délimiteurs

Comment couper une chaîne sans enlever les délimiteurs?

disons que j'ai une chaîne de caractères: var string = "abcdeabcde";

quand je le fais var newstring = string.split("d"), j'obtiens quelque chose comme ceci:

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

Mais je veux obtenir ceci:

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

quand j'ai essayé de faire ma fonction "split2", j'ai tout pris dans splice() et Index et "this" vs "that" and ... aargh! À l'aide! : D

39
demandé sur Martin Janiczek 2010-12-23 01:03:18

12 réponses

essaye ceci:

  1. remplacer toutes les instances " d "par", d"
  2. Split ","
var string = "abcdeabcde";
var newstringreplaced = string.replace(/d/gi, ",d");
var newstring = newstringreplaced.split(",");
return newstring;

Espérons que cette aide.

17
répondu InfoLearner 2013-04-29 12:45:59

Essaie:

"abcdeabcde".split(/(d)/);
43
répondu Kai 2010-12-22 22:16:47
var parts= string.split('d');
for (var i= parts.length; i-->1;)
    parts.splice(i, 0, 'd');

(la boucle inversée est nécessaire pour éviter d'ajouter ds pour les parties de la liste qui ont déjà eu d s insérée.)

18
répondu bobince 2010-12-22 22:19:52

j'aime la réponse de Kai, mais c'est incomplet. Au lieu d'utiliser:

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

ceci utilise un Anticipation De Longueur Nulle Affirmation dans regex, ce qui fait qu'une correspondance ne fait pas partie du groupe de capture. Pas d'autres astuces ou solutions nécessaires.

10
répondu micha 2017-07-26 10:04:00

Peut être fait en une seule ligne:

var string = "abcdeabcde";    
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]
8
répondu JonMayer 2014-09-03 15:12:53

split - split est utilisé pour créer des lignes de pas pour la recherche.

[^D] - trouver un groupe de substrats ne contenant pas"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", ""]

Lire "Objet RegExp" si vous ne voulez pas de problèmes avec le "javascript".

5
répondu udn79 2012-12-10 23:19:45

Ceci est ma version pour les délimiteurs regexp. Il a la même interface avec String.prototype.split; il traitera global et non global regexp sans différence. La valeur retournée est un tableau dont les membres impairs sont des délimiteurs assortis.

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));
}
2
répondu Ebrahim Byagowi 2013-07-04 13:56:23

essaye ceci:

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);
    }
1
répondu Chandu 2010-12-22 22:12:16

il suffit d'annuler le String.prototype.split fonction avec celle-ci :

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' ]

cette méthode n'échouera pas, n'utilisez pas d'expressions régulières et est compatible avec l'original String.split fonction. Il est également compatible avec l' str.split(/(d)/); solution, mais n'échouera pas dans IE.

La seule restriction est que, si le deuxième paramètre est utilisé (le split fonction de remplacement drop-in), alors le délimiteur ne peut pas être une expression régulière. Mais si vous y réfléchissez un peu, ce n'est pas un restriction réelle puisque vous n'avez pas besoin du second paramètre si vous utilisez l'expression regular...

1
répondu Yanick Rochon 2010-12-22 23:06:45

Essayez ceci

"abcdeabcde".split("d").reduce((result, value, index) => {
    return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
1
répondu heesu Suh 2017-07-28 14:38:44
function split2(original){
   var delimiter = "d", result = [], tmp;
   tmp = original.split(delimiter);
   tmp.forEach(function(x){result.push(x); result.push(delimiter); });
   return result;
}
0
répondu pc1oad1etter 2010-12-22 22:16:45

Essayez ceci

var string = "abcdeabcde";
var res = string.replace( /d/g, 'd' ).split(/(?=d)|/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]
0
répondu meouw 2010-12-22 22:19:25