Javascript y expresiones regulares: dividir cadena y mantener el separador

Resuelto Milos Cuculovic asked hace 12 años • 11 respuestas

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);

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?

Milos Cuculovic avatar Aug 17 '12 14:08 Milos Cuculovic
Aceptado

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);
jichi avatar Aug 09 '2014 18:08 jichi

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 />&dagger; bbbb<br />&Dagger; cccc";
console.log(string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g));
Expandir fragmento

Jon avatar Aug 17 '2012 08:08 Jon

Si envuelve el delimitador entre paréntesis, será parte de la matriz devuelta.

string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />&dagger;", "bbbb", "<br />&Dagger;", "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: \diguales [0-9]y \wiguales [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 .

Torsten Walter avatar Aug 17 '2012 08:08 Torsten Walter