Estoy buscando dividir mi cadena en base a [,]. Pero hay una restricción, si el [,] viene dentro de "", debemos ignorarlos.

Ejemplo:

Para una cadena:

"""hello "hi" [abc: "pqr[abc]"] bye | [xyz]"""

Las cadenas divididas deben ser:

hello "hi"
abc: "pqr[abc]"
bye |
xyz
0
Priyansh Goel 14 ene. 2018 a las 21:29

3 respuestas

La mejor respuesta

En lugar de tratar de dividir, puede usar el método find() y describir todo lo que no es un corchete excepto las partes entre comillas:

[^\]\["]+(?:"[^"]*"[^\]\["]*)*|(?:"[^"]*"[^\]\["]*)+

(No olvides agregar barras invertidas en la cadena de tu patrón).

Demo

1
Casimir et Hippolyte 14 ene. 2018 a las 18:37

Si realmente necesita dividir, puede usar el análisis anticipado para verificar que el número de comillas que sigue al delimitador candidato es par:

[\][](?=[^"]*(?:"[^"]*"[^"]*)*$)

Pero la anticipación es bastante ineficiente. Si es aceptable hacer lo contrario y encontrar las coincidencias entre los delimitadores (con find()), en lugar de dividir, puede usar:

(?:[^"\][]|"[^"]*")+

1
trincot 14 ene. 2018 a las 19:08

Una de las posibles soluciones (que no requiere expresiones regulares difíciles) podría ser la siguiente:

(1) dividir sin tener en cuenta las citas

(2) cuente números (acumulativos) de comillas en cada componente resultante

(3) vuelva a unirse en los límites donde dicho número es impar

1
AndreyS Scherbakov 14 ene. 2018 a las 18:43