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);
Obtengo 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 ligeramente diferente. De todos modos, aquí hay ejemplos de tres escenarios diferentes sobre 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);
Utilice una búsqueda anticipada (positiva) para que la expresión regular afirme que el carácter especial existe, pero en realidad no coincida con él:
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));
Si envuelve el delimitador entre paréntesis, será parte de la matriz devuelta.
string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />†", "bbbb", "<br />‡", "cccc"]
Dependiendo de qué parte quieras conservar, cambia el subgrupo con el que coincidas.
string.split(/(<br \/>)&#?[a-zA-Z0-9]+;/g);
// returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]
Podrías mejorar la expresión ignorando el caso de las letras string.split(/()&#?[a-z0-9]+;/gi);
Y puedes hacer coincidir grupos predefinidos como este: \d
iguales [0-9]
y \w
iguales [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 .