separar - Javascript y regex: dividir cadena y mantener el separador
separar cadena jquery (7)
Tengo una cadena:
var string = "aaaaaa<br />† bbbb<br />‡ 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 />† bbbb<br />‡ 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 />† bbbb",
"<br />‡ cccc"
]
Si ajusta el delimitador en parantheses, será parte de la matriz devuelta.
string.split(/(<br //>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />†", "bbbb", "<br />‡", "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 />† bbbb<br />‡ 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''));