Saltar al contenido

¿Cómo divido un string con múltiples separadores en JavaScript?

Esta es la solución más completa que encomtrarás compartir, sin embargo mírala detenidamente y analiza si se adapta a tu proyecto.

Solución:

Pase una expresión regular como parámetro:

js> "Hello awesome, world!".split(/[s,]+/)
Hello,awesome,world!

Editado para agregar:

Puede obtener el último elemento seleccionando la longitud del array menos 1:

>>> bits = "Hello awesome, world!".split(/[s,]+/)
["Hello", "awesome", "world!"]
>>> bit = bits[bits.length - 1]
"world!"

… y si el patrón no coincide:

>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"

Puede pasar una expresión regular al operador de división de Javascript. Por ejemplo:

"1,2 3".split(/,| /) 
["1", "2", "3"]

O, si desea permitir que varios separadores actúen juntos como uno solo:

"1, 2, , 3".split(/(?:,| )+/) 
["1", "2", "3"]

(Tienes que usar los paréntesis que no capturan (? 🙂 porque, de lo contrario, se empalman de nuevo en el resultado. O puedes ser inteligente como Aaron y usar una clase de personaje).

(Ejemplos probados en Safari + FF)

Otro método simple pero efectivo es usar dividir + unir repetidamente.

"a=b,c:d".split('=').join(',').split(':').join(',').split(',')

Esencialmente, hacer una división seguida de una unión es como un reemplazo global, por lo que reemplaza cada separador con una coma y luego, una vez que se reemplazan todos, hace una división final en coma

El resultado de la expresión anterior es:

['a', 'b', 'c', 'd']

Ampliando esto, también podría colocarlo en una función:

function splitMulti(str, tokens)
        var tempChar = tokens[0]; // We can use the first token as a temporary join character
        for(var i = 1; i < tokens.length; i++)
            str = str.split(tokens[i]).join(tempChar);
        
        str = str.split(tempChar);
        return str;

Uso:

splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]

Si usa mucho esta funcionalidad, incluso podría valer la pena considerar envolver String.prototype.split por conveniencia (creo que mi función es bastante segura; la única consideración es la sobrecarga adicional de los condicionales (menores) y el hecho de que carece de una implementación del argumento de límite si un array esta pasado).

Asegúrese de incluir el splitMulti si usa este enfoque para lo siguiente, simplemente lo envuelve :). También vale la pena señalar que algunas personas fruncen el ceño al extender los elementos integrados (ya que muchas personas lo hacen mal y pueden surgir conflictos), por lo que si tiene dudas, hable con alguien más senior antes de usar esto o pregunte en SO 🙂

    var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
    String.prototype.split = function ()
        if(arguments[0].length > 0)
            if(Object.prototype.toString.call(arguments[0]) == "[object Array]" )  // Check if our separator is an array
                return splitMulti(this, arguments[0]);  // Call splitMulti
            
        
        return splitOrig.apply(this, arguments); // Call original split maintaining context
    ;

Uso:

var a = "a=b,c:d";
    a.split(['=', ',', ':']); // ["a", "b", "c", "d"]

// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
        a.split('='); // ["a", "b,c:d"] 

¡Disfrutar!

Aquí tienes las reseñas y puntuaciones

Agradecemos que quieras añadir valor a nuestro contenido aportando tu veteranía en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *