web-dev-qa-db-fra.com

JS string.split () sans supprimer les délimiteurs

Comment puis-je diviser une chaîne sans supprimer les délimiteurs?

Disons que j'ai une chaîne: var string = "abcdeabcde";

Quand je 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", je me suis tout empêtré dans splice () et les index et "this" vs "that" et ... aargh! Aidez-moi! :RÉ

45
Martin Janiczek

Essaye ça:

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

J'espère que cela t'aides.

20
InfoLearner

Essayer:

"abcdeabcde".split(/(d)/);
47
Kai
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 aux parties de la liste qui ont déjà été insérées ds.)

18
bobince

J'aime la réponse de Kai , mais c'est incomplet. Utilisez plutôt:

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

Cela utilise un Lookahead Zero-Length Assertion dans regex, ce qui fait qu'une correspondance ne fait pas partie du groupe de capture. Aucune autre astuce ou solution de contournement n'est nécessaire.

16
micha

Peut se faire en une seule ligne:

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

split - split est utilisé pour créer des lignes séparées et non pour la recherche.

[^ d] - recherche un groupe de sous-chaînes 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", ""]

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

5
udn79

Ceci est ma version pour les délimiteurs d'expressions régulières. Il a la même interface avec String.prototype.split; il traitera les expressions rationnelles globales et non globales sans aucune différence. La valeur renvoyée est un tableau dont les membres impairs sont des délimiteurs correspondants.

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
Ebrahim Byagowi

Essaye ça:

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
Chandu

Essaye ça

"abcdeabcde".split("d").reduce((result, value, index) => {
    return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
1
heesu Suh
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
pc1oad1etter

Remplacez simplement la fonction String.prototype.split Par 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 cohérente avec la fonction String.split D'origine. Il est également cohérent avec la solution str.split(/(d)/);, mais n'échouera pas dans IE.

La seule restriction est que, si le deuxième paramètre est utilisé (la fonction drop-in de remplacement split), 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 une vraie restriction puisque vous n'avez pas besoin du deuxième paramètre si vous utilisez l'expression régulière ...

0
Yanick Rochon

Essaye ça

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