2009-04-08 25 views
11

EDIT: ¿Puede alguien ayudarme con una expresión regular para una cadena como esta ?:¿Cómo dividir la cadena por ',' a menos que ',' esté entre paréntesis usando Regex?

[Header 1], [Head,er 2], Header 3

para que pueda dividirla en trozos como:

[Header 1]
[Head,er 2]
Header 3

he llegado tan lejos como esto:

(?<=,|^).*?(?=,|$) 

que me dará:

[Header 1]
[Head
,er 2]
Header 3

+0

¿Cuántas implementaciones de CSV necesita el mundo? –

+0

¿Es esta una pregunta de tarea?Porque me resulta más sencillo usar simplemente la antigua manipulación, básicamente: para cada char: si char es una coma y no dentro de un paréntesis, entonces agregue la cadena actual a la lista –

Respuesta

15

En este caso, es más fácil dividir los delimitadores (comas) que hacer coincidir los tokens (o trozos). La identificación de las comas que son delimitadores toma una búsqueda hacia delante relativamente simple:

,(?=[^\]]*(?:\[|$)) 

Cada vez que encuentre una coma, usted hace una búsqueda hacia delante de una de las tres cosas. Si encuentra un corchete de cierre primero, la coma está dentro de un par de corchetes, por lo que no es un delimitador. Si encuentra un corchete de apertura o el final de la línea/cadena, es un delimitador.

+0

Ah I mira, puedo reemplazar las comas con otra char especial y dividirlas con precisión usando eso. ¡Eso funcionará para mí! ¡Gracias! – Nate

+0

Esto funciona perfecto siempre que no haya corchetes anidados. Por ejemplo, funciona como se espera para '[a], [b], [c [d, e]]' pero falla en '[a], [b], [c, [d, e]]'. Coincide con la coma al lado de c en el último ejemplo. ¿Cómo se puede mejorar esto para que no coincida con eso también? – matte

+0

En realidad, para ser más preciso para '[a], [b, []' coincide con la coma después de b. Si hay un corchete de apertura en '[]', este patrón coincide con la coma entre corchetes. – matte

1

¿No es tan simple como esto?

(?<=,|^)(?:[^,]|\[[^[]*\])* 
+0

Cuando uso su expresión regular, obtengo las siguientes herramientas de desarrollo: 'regex =/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) */ SyntaxError: expresión regular no válida:/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) * /: Grupo inválido' – starbeamrainbowlabs

2
(?<=,|^)\s*\[[^]]*\]\s*(?=,|$) 

utilizan los [ y ] delimitadores a su ventaja

6
\[.*?\] 

Olvídese de las comas, que no se preocupan por ellos. :)

+0

Buena respuesta, pero cambió la pregunta sobre usted ... – dmckee

+0

Bueno, ahora estoy confundido. ¿Realmente dice Header o es algún marcador de posición? ¿Los corchetes están realmente allí o son opcionales? Ahora se ha vuelto confuso exactamente cuáles son las cadenas de entrada válidas. –

+0

Perdón por cambiarlo, las cadenas de entrada válidas son [Algunos textos], Algunos más textos, [Sin embargo, re texto] ... divididos en [Algunos textos]/Algunos más Texto/[Sin embargo, re texto] – Nate

1

Usted podría utilizar una expresión regular para coincidir con los valores dentro de los corchetes:

\[[^\]*]\] 

O utilizar esta expresión regular para dividir la lista de soporte (usando de consulta en torno a las afirmaciones):

(?<=]|^)\s*,\s*(?=\[|$) 
Cuestiones relacionadas