2011-06-04 27 views
8

tengo una cadena similar a ésta:C# avanzado String.split

El niño le dijo a su madre: "¿Puedo tener un poco de caramelo?"

Si hago una normal de String.Split en él, me sale:

{ 'The', 'boy', 'said', 'to', 'his', 'mother', '"Can', 'I', 'have', 'some', 'candy?"' } 

Quiero una matriz de este modo:

{ 'The', 'boy', 'said', 'to', 'his', 'mother', 'Can I have some candy?' } 

Obviamente, acabo de poder recorrer carácter por carácter y hacer un seguimiento de si estoy en una cuerda o no y todo eso ... pero ¿hay una mejor manera? Con Regexs tal vez?

+0

consideran "cadena de análisis como la cáscara" como una frase útil para este tipo de pedir –

Respuesta

9

¿Qué hay de encontrar todos los partidos de esta expresión regular:

"[^"]*"|\S+ 
+0

esto es grande! una cosa más ... aunque es posible eliminar las citas del "¿Puedo tener algún ¿Dulce? "partido? – Entity

+3

@TheAdamGask ins: 'String.Trim ('"') '. – Ryan

2

depende un poco de sus necesidades. P.ej. ¿necesita tratar AAA "BBB (sin espacios) como palabra de signle, o dos palabras? Si AAA" BBB es una sola palabra, y "solo inicia un campo con qouted después del delimitador - esto se ve como un analizador de CSV. Por supuesto, CSV tiene otras reglas, como double qoutes para significar literal quote, etc. - pero también necesitaría definir algunas reglas similares.

Para que pueda adaptar cualquier analizador de código abierto CSV, o ver si funciona, por ejemplo, Microsoft.VisualBasic.FileIO.TextFieldParser para usted

 string msg = "The boy said to his mother, \"Can I have some candy?\""; 
     System.IO.MemoryStream s = new System.IO.MemoryStream(Encoding.Unicode.GetBytes(msg)); 
     TextFieldParser p = new TextFieldParser(s, Encoding.Unicode); 
     p.Delimiters = new string[] { " ", "," }; 
     foreach(var f in p.ReadFields().Where(f => f != "")) 
      Console.WriteLine(f); 
Cuestiones relacionadas