una separar recorrer quitar por numeros manejo letras extraer eliminar contar comas caracteres cadenas cadena javascript regex

separar - Javascript y regex: dividir cadena y mantener el separador



separar cadena jquery (7)

Tengo una cadena:

var string = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc"

Y me gustaría dividir esta cadena con el delimitador <br /> seguido de un carácter especial.

Para hacer eso, estoy usando esto:

string.split(/<br //>&#?[a-zA-Z0-9]+;/g);

Estoy obteniendo lo que necesito, excepto que estoy perdiendo el delimitador. Aquí está el ejemplo: http://jsfiddle.net/JwrZ6/1/

¿Cómo puedo mantener el delimitador?


Estaba teniendo un problema similar pero levemente diferente. De todos modos, aquí hay ejemplos de tres escenarios diferentes para dónde guardar el delimitador.

"1、2、3".split("、") == ["1", "2", "3"] "1、2、3".split(/(、)/g) == ["1", "、", "2", "、", "3"] "1、2、3".split(/(?=、)/g) == ["1", "、2", "、3"] "1、2、3".split(/(?!、)/g) == ["1、", "2、", "3"] "1、2、3".split(/(.*?、)/g) == ["", "1、", "", "2、", "3"]

Advertencia: el cuarto solo funcionará para dividir caracteres individuales. ConnorsFan presenta una alternativa :

// Split a path, but keep the slashes that follow directories var str = ''Animation/rawr/javascript.js''; var tokens = str.match(/[^//]+//?|///g);


He estado usando esto:

String.prototype.splitBy = function (delimiter) { var delimiterPATTERN = ''('' + delimiter + '')'', delimiterRE = new RegExp(delimiterPATTERN, ''g''); return this.split(delimiterRE).reduce((chunks, item) => { if (item.match(delimiterRE)){ chunks.push(item) } else { chunks[chunks.length - 1] += item }; return chunks }, []) }

Excepto que no deberías meterse con String.prototype , así que aquí hay una versión de función:

var splitBy = function (text, delimiter) { var delimiterPATTERN = ''('' + delimiter + '')'', delimiterRE = new RegExp(delimiterPATTERN, ''g''); return text.split(delimiterRE).reduce(function(chunks, item){ if (item.match(delimiterRE)){ chunks.push(item) } else { chunks[chunks.length - 1] += item }; return chunks }, []) }

Entonces podrías hacer:

var haystack = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc" var needle = ''<br //>&#?[a-zA-Z0-9]+;''; var result = splitBy(string, haystack) console.log( JSON.stringify( result, null, 2) )

Y terminarás con:

[ "<br />&dagger; bbbb", "<br />&Dagger; cccc" ]


Si ajusta el delimitador en parantheses, será parte de la matriz devuelta.

string.split(/(<br //>&#?[a-zA-Z0-9]+);/g); // returns ["aaaaaa", "<br />&dagger;", "bbbb", "<br />&Dagger;", "cccc"]

Dependiendo de la parte que quieras conservar, cambia el subgrupo que coincida

string.split(/(<br //>)&#?[a-zA-Z0-9]+;/g); // returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]

Puede mejorar la expresión ignorando el caso de las letras string.split (/ () & #? [A-z0-9] +; / gi);

Y puede hacer coincidir grupos predefinidos como este: /d es igual a [0-9] y /w es igual a [a-zA-Z0-9_] . Esto significa que tu expresión podría verse así.

string.split(/<br //>(&#?[a-z/d]+;)/gi);

Hay una buena referencia de expresiones regulares en JavaScriptKit .


Una función de extensión divide la cadena con subcadena o RegEx y el delimitador se coloca según el segundo parámetro adelante o atrás.

String.prototype.splitKeep = function (splitter, ahead) { var self = this; var result = []; if (splitter != '''') { var matches = []; // Getting mached value and its index var replaceName = splitter instanceof RegExp ? "replace" : "replaceAll"; var r = self[replaceName](splitter, function (m, i, e) { matches.push({ value: m, index: i }); return getSubst(m); }); // Finds split substrings var lastIndex = 0; for (var i = 0; i < matches.length; i++) { var m = matches[i]; var nextIndex = ahead == true ? m.index : m.index + m.value.length; if (nextIndex != lastIndex) { var part = self.substring(lastIndex, nextIndex); result.push(part); lastIndex = nextIndex; } }; if (lastIndex < self.length) { var part = self.substring(lastIndex, self.length); result.push(part); }; // Substitution of matched string function getSubst(value) { var substChar = value[0] == ''0'' ? ''1'' : ''0''; var subst = ''''; for (var i = 0; i < value.length; i++) { subst += substChar; } return subst; }; } else { result.add(self); }; return result; };

La prueba:

test(''splitKeep'', function () { // String deepEqual("1231451".splitKeep(''1''), ["1", "231", "451"]); deepEqual("123145".splitKeep(''1'', true), ["123", "145"]); deepEqual("1231451".splitKeep(''1'', true), ["123", "145", "1"]); deepEqual("hello man how are you!".splitKeep('' ''), ["hello ", "man ", "how ", "are ", "you!"]); deepEqual("hello man how are you!".splitKeep('' '', true), ["hello", " man", " how", " are", " you!"]); // Regex deepEqual("mhellommhellommmhello".splitKeep(/m+/g), ["m", "hellomm", "hellommm", "hello"]); deepEqual("mhellommhellommmhello".splitKeep(/m+/g, true), ["mhello", "mmhello", "mmmhello"]); });


Utilice la búsqueda anticipada positiva para que la expresión regular afirme que el carácter especial existe, pero en realidad no coincide:

string.split(/<br //>(?=&#?[a-zA-Z0-9]+;)/g);

Véalo en acción:

var string = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc"; console.log(string.split(/<br //>(?=&#?[a-zA-Z0-9]+;)/g));

Actualización: error de escritura fijo (literal movido ; parens de búsqueda anticipada)


aquí también lo ha respondido JavaScript Dividir expresión regular mantener el delimitador

utilice el patrón de búsqueda anticipada (? = patrón) en el ejemplo de expresiones regulares

var string = ''500x500-11*90~1+1''; string = string.replace(/(?=[$-/:-?{-~!"^_`/[/]])/gi, ","); string = string.split(",");

esto te dará el siguiente resultado.

[ ''500x500'', ''-11'', ''*90'', ''~1'', ''+1'' ]

También se puede dividir directamente

string = string.split(/(?=[$-/:-?{-~!"^_`/[/]])/gi);

dando el mismo resultado

[ ''500x500'', ''-11'', ''*90'', ''~1'', ''+1'' ]


function formatDate(dt, format) { var monthNames = [ "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Setiembre", "Octubre", "Noviembre", "Diciembre" ]; var Days = [ "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" ]; function pad(n, width, z) { z = z || ''0''; n = n + ''''; return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } function replace(val, date) { switch (val) { case ''yyyy'': return date.getFullYear(); case ''YYYY'': return date.getFullYear(); case ''yy'': return (date.getFullYear() + "").substring(2); case ''YY'': return (date.getFullYear() + "").substring(2); case ''MMMM'': return monthNames[date.getMonth()]; case ''MMM'': return monthNames[date.getMonth()].substring(0, 3); case ''MM'': return pad(date.getMonth() + 1, 2); case ''M'': return date.getMonth() + 1; case ''dd'': return pad(date.getDate(), 2); case ''d'': return date.getDate(); case ''DD'': return Days[date.getDay()]; case ''D'': return Days[date.getDay()].substring(0, 3); case ''HH'': return pad(date.getHours(), 2); case ''H'': return date.getHours(); case ''mm'': return pad(date.getMinutes(), 2); case ''m'': return date.getMinutes(); case ''ss'': return pad(date.getSeconds(), 2); case ''s'': return date.getSeconds(); default: return val; } } var ds = format.split(/( |,|:)/g); var newFormat = ''''; for (var i = 0; i < ds.length; i++) { newFormat += replace(ds[i], dt); } return newFormat; } var a = "2016-08-22T16:02:05.645Z"; var d = new Date(Date.parse(a)); // var d = new Date(); console.log(formatDate(d, ''d de MMMM, de YYYY H:mm''));