Búsqueda de sitios web

Javascript y expresiones regulares: dividir cadena y mantener el separador


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?

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 />&dagger; bbbb<br />&Dagger; 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 />&dagger;", "bbbb", "<br />&Dagger;", "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.

Artículos relacionados