2011-01-24 18 views
10

Necesito dividir una cadena como la siguiente, basada en el espacio como delimitador. Pero cualquier espacio dentro de una cita debe ser preservado.Cadena dividida Regex que conserva las comillas

research library "not available" author:"Bernard Shaw" 

a

research 
library 
"not available" 
author:"Bernard Shaw" 

que estoy tratando de hacer esto en C Sharp, tengo esta expresión regular: @"(?<="")|\w[\w\s]*(?="")|\w+|""[\w\s]*""" desde otro puesto en el SO, que divide la cadena en

research 
library 
"not available" 
author 
"Bernard Shaw" 

cuales lamentablemente no cumple con mis requisitos exactos.

Estoy buscando cualquier Regex, eso haría el truco.

Cualquier ayuda apreciada.

Respuesta

25

Mientras no puede haber escaparon citado en el interior de cadenas entre comillas, lo siguiente debería funcionar:

splitArray = Regex.Split(subjectString, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*) (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); 

Este expresiones regulares fracturas en los caracteres de espacio sólo si están precedidos y seguidos por un número par de frases.

La expresión regular sin todos aquellos escaparon cotizaciones, explicó:

(?<=  # Assert that it's possible to match this before the current position (positive lookbehind): 
^  # The start of the string 
[^"]* # Any number of non-quote characters 
(?:  # Match the following group... 
    "[^"]* # a quote, followed by any number of non-quote characters 
    "[^"]* # the same 
)*  # ...zero or more times (so 0, 2, 4, ... quotes will match) 
)   # End of lookbehind assertion. 
[ ]  # Match a space 
(?=  # Assert that it's possible to match this after the current position (positive lookahead): 
(?:  # Match the following group... 
    [^"]*" # see above 
    [^"]*" # see above 
)*  # ...zero or more times. 
[^"]* # Match any number of non-quote characters 
$  # Match the end of the string 
)   # End of lookahead assertion 
+0

cómo dividir con puntos, signos de interrogación, exclama marcas de marca, etc. en lugar de espacios. Estoy tratando de obtener cada oración una por una, excepto dentro de las comillas. Por ejemplo: Walked. ** Volvió atrás. ** ¿Pero por qué? ** Y dijo "Hola mundo. ¡Maldita sea esta cuerda dividiendo las cosas!" sin vergüenza. ** – ErTR

+1

@ ErtürkÖztürk: Eso es digno de su propia pregunta StackOverflow - demasiado grande para ser respondida en un comentario. –

+1

@TimPietzcker, así que no sé por qué, pero hice casi la misma pregunta (http://stackoverflow.com/questions/33886103/how-to-find-recurring-word-groups-in-text-with-c) y Recibí demasiada reacción como "aquí no hay un servicio de escritura de código" o "no está claro", así que estoy probando mi oportunidad en los comentarios. – ErTR

3

Aquí van:

C#:

Regex.Matches(subject, @"([^\s]*""[^""]+""[^\s]*)|\w+") 

Expresión regular:

([^\s]*\"[^\"]+\"[^\s]*)|\w+ 
+0

Heh, no notó la respuesta de Tim. Eso funcionará para dividir, esto es para hacer coincidir. –

+0

Gracias Jivlain, funciona perfectamente también, para hacer coincidir. – itsbalur

Cuestiones relacionadas