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É
Essaye ça:
var string = "abcdeabcde";
var newstringreplaced = string.replace(/d/gi, ",d");
var newstring = newstringreplaced.split(",");
return newstring;
J'espère que cela t'aides.
Essayer:
"abcdeabcde".split(/(d)/);
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 d
s aux parties de la liste qui ont déjà été insérées d
s.)
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.
Peut se faire en une seule ligne:
var string = "abcdeabcde";
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]
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".
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));
}
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);
}
Essaye ça
"abcdeabcde".split("d").reduce((result, value, index) => {
return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
function split2(original){
var delimiter = "d", result = [], tmp;
tmp = original.split(delimiter);
tmp.forEach(function(x){result.Push(x); result.Push(delimiter); });
return result;
}
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 ...
Essaye ça
var string = "abcdeabcde";
var res = string.replace( /d/g, 'd\0' ).split(/(?=d)|\0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]