Regex: división por carácter, a menos que esté entre comillas

    Muchas veces, cuando estás analizando texto, necesitas dividir cadenas en un carácter de coma (o nuevas líneas, pestañas, etc.), pero ¿qué pasa si necesitas usar una coma en tu cadena y no dividirla? Un ejemplo de esto podría ser un gran número. Entonces, tal vez tengamos una cadena como esta:

    Te puede interesar:Configurar un clúster de Node.js
    age: 28, favorite number: 26, salary: $1,234,108
    

    Dividir por comas en esto daría como resultado:

    Te puede interesar:¿Qué es Arduino?
    age: 28
    favorite number: 26
    salary: $1
    234
    108
    

    Cerca, pero no del todo.

    Te puede interesar:Cómo instalar Node.js en Ubuntu

    Para propósitos de formato, muchos números tienen comas como esta, por lo que realmente no podemos evitarlo.

    Te puede interesar:Cómo escribir middleware Express.js

    Una forma de resolver este problema es poner comillas alrededor de la cadena que no debe dividirse. Entonces, nuestro ejemplo anterior se vería así:

    Te puede interesar:Adición de autenticación a Express con Passport
    age: 28, favorite number: 26, "salary: $1,234,108"
    

    Entonces, ahora para dividir esto, necesitaremos crear una cadena de expresiones regulares que diga «dividir en todos los caracteres de coma a menos que esté entre comillas».

    Te puede interesar:Error de NPM «no se pudo recuperar del registro» al instalar el módulo

    Usando Java y Regex, esto debería funcionar:

    Te puede interesar:Redes neuronales en JavaScript con Brain.js
    String[] strArray = text.split(",(?=([^"]*"[^"]*")*[^"]*$)");
    

    Usando la cadena de expresiones regulares anterior, así es como dividiríamos una cadena usando Java:

    Te puede interesar:Ejemplo: servicio REST con Apache Camel
    String input = "age: 28, favorite number: 26, "salary: $1,234,108"";
    String[] splits = input.split(",(?=([^"]*"[^"]*")*[^"]*$)");
    for (int i = 0; i < splits.length; i++) {
        System.out.println(splits[i].trim());
    }
    // Output:
    // age: 28
    // favorite number: 26
    // salary: $1,234,108
    

    Esta cadena de expresiones regulares usa lo que se llama una «búsqueda anticipada positiva» para verificar las comillas sin hacer coincidirlas.

    Te puede interesar:Ejemplo: agregar autocompletar a JTextField

    Esta es una característica realmente poderosa en regex, pero puede ser difícil de implementar.

    Te puede interesar:Ejemplo: carga de una clase Java en tiempo de ejecución

    Para practicar, intente mirar la expresión regular que le dimos y vea si puede modificarla para dividirla en un carácter diferente, como un punto y coma (;). Si le resultó fácil, intente modificarlo para que tenga dos comillas en cada lado de la cadena.

    Te puede interesar:Cómo enviar un correo electrónico con boto y SES

    ¿Tiene una cadena de expresiones regulares más simple o algunos consejos para crearlas? ¡Háznoslo saber en los comentarios!

    Te puede interesar:Ejemplo: cargar un archivo en AWS S3 con Boto

     

    Rate this post