javascript - ejemplo - split jquery array
JS string.split() sin eliminar los delimitadores (12)
Esta es mi versión para los delimitadores de expresiones regulares. Tiene la misma interfaz con String.prototype.split; tratará la expresión regular global y no global sin ninguna diferencia. El valor devuelto es una matriz en la que el miembro impar es delimitadores coincidentes.
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));
}
¿Cómo puedo dividir una cadena sin eliminar los delimitadores?
Digamos que tengo una cadena: var string = "abcdeabcde";
Cuando hago var newstring = string.split("d")
, obtengo algo como esto:
["abc","eabc","e"]
Pero quiero obtener esto:
["abc","d","eabc","d","e"]
Cuando traté de hacer mi función "split2", me enredé en empalmes () e índices y "esto" contra "eso" y ... ¡aargh! ¡Ayuda! :RE
Me gusta here , pero está incompleta. En su lugar use:
"abcdeabcde".split(/(?=d)/g) //-> ["abc", "deabc", "de"]
Esto está usando una aserción de longitud cero de Lookahead en regex, que hace que una coincidencia no forme parte del grupo de captura. No hay otros trucos o soluciones necesarias.
Prueba esto
"abcdeabcde".split("d").reduce((result, value, index) => {
return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
Prueba esto
var string = "abcdeabcde";
var res = string.replace( /d/g, ''d/0'' ).split(/(?=d)|/0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]
Prueba esto:
- Reemplaza todas las instancias "d" en ", d"
- Dividir por ","
var string = "abcdeabcde";
var newstringreplaced = string.replace(/d/gi, ",d");
var newstring = newstringreplaced.split(",");
return newstring;
Espero que esto ayude.
Prueba esto:
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);
}
Se puede hacer en una línea:
var string = "abcdeabcde";
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]
Simplemente anule la función String.prototype.split
con esta:
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'' ]
Este método no fallará, no use expresiones regulares y sea consistente con la función String.split
original. También es coherente con str.split(/(d)/);
solución, pero no fallará en IE.
La única restricción es que, si se usa el segundo parámetro (la función de reemplazo de reemplazo split
), entonces el delimitador no puede ser una expresión regular. Pero si lo piensas un poco, no es una restricción real ya que no necesitas el segundo parámetro si usas la expresión regular ...
Tratar:
"abcdeabcde".split(/(d)/);
split - split se usa para crear líneas separadas, no para buscar.
[^ d] - encuentre un grupo de subcadenas que no contengan "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", ""]
Lea "RegExp Object" si no quiere problemas con el "javascript".
function split2(original){
var delimiter = "d", result = [], tmp;
tmp = original.split(delimiter);
tmp.forEach(function(x){result.push(x); result.push(delimiter); });
return result;
}
var parts= string.split(''d'');
for (var i= parts.length; i-->1;)
parts.splice(i, 0, ''d'');
(El ciclo invertido es necesario para evitar agregar d
s a partes de la lista que ya se han insertado d
s).