Javascript y expresiones regulares: dividir cadena y mantener el separador
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?
Respuesta #1
Tenía un problema similar pero ligeramente diferente. De todos modos, aquí hay ejemplos de tres escenarios diferentes sobre dónde mantener 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);
Respuesta #2
Usa una anticipación (positivo) para que la expresión regular afirme que el carácter especial existe, pero en realidad no lo coincida:
string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g);
Verlo en acción:
var string = "aaaaaa<br />† bbbb<br />‡ cccc";
console.log(string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g));Respuesta #3
Si envuelves el delimitador entre paréntesis, será parte del arreglo devuelto.
string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />†", "bbbb", "<br />‡", "cccc"]
Dependiendo de qué parte quieras mantener, cambia a qué subgrupo coincides
string.split(/(<br \/>)&#?[a-zA-Z0-9]+;/g);
// returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]
Podrías mejorar la expresión ignorando las mayúsculas y minúsculas de las letras string.split(/()&#?[a-z0-9]+;/gi);
Y puedes hacer coincidencias para grupos predefinidos así: \d equivale a [0-9] y \w equivale 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.
