Regex: dividir por carácter, a menos que esté entre comillas

Muchas veces, cuando está analizando texto, se encuentra con la necesidad de dividir cadenas en un carácter de coma (o nuevas líneas, tabulaciones, etc.), pero entonces, ¿qué sucede si necesita u...

Muchas veces, cuando está analizando texto, necesita dividir cadenas en un carácter de coma (o nuevas líneas, tabulaciones, etc.), pero entonces, ¿qué sucede si necesita usar una coma en su cadena y * no * dividir en ¿eso? Un ejemplo de esto podría ser un gran número. Así que tal vez tendríamos una cadena como esta:

1
age: 28, favorite number: 26, salary: $1,234,108

Dividir por comas en esto produciría:

1
2
3
4
5
age: 28
favorite number: 26
salary: $1
234
108

Cerca, pero no del todo.

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

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

1
age: 28, favorite number: 26, "salary: $1,234,108"

Así que ahora, para dividir esto, necesitaremos crear una cadena de expresión regular que diga "dividir en todos los caracteres de coma a menos que esté entre comillas".

Usando Java y Regex, esto debería funcionar:

1
String[] strArray = text.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");

Usando la cadena regex anterior, así es como dividiríamos una cadena usando Java:

1
2
3
4
5
6
7
8
9
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 regex usa lo que se llama "búsqueda positiva" para verificar si hay comillas sin coincidir realmente con ellas.

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

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 eso fue fácil, intente modificarlo para que necesite ver dos comillas a cada lado de la cadena.

  • ¿Tiene una cadena de expresiones regulares más simple o algunos consejos para crearlas? ¡Cuéntanos en los comentarios!*