2011-03-09 23 views
5

Este hilo es muy similar a lo que quiero: Regular Expression to split on spaces unless in quotesC# - expresión regular para Separar una cadena de espacios, a menos que una comilla doble se encuentra

Pero necesito algunas reglas adicionales que no puedo averiguar: - la el hilo anterior se divide en espacios, a menos que estén entre comillas dobles. Sin embargo, también se divide en puntuación. Necesito que todo dentro de las comillas dobles permanezca como una sola entidad.

Por ejemplo:
/actualización setting0 value = "valor nuevo"/Guardar debe devolver
/actualización del valor
setting0
=
nuevo valor (no me importa si se recorta el cita fuera o no)
/Guardar

/Importar "C: \ ruta \ file.xml" "C: \ PATH_2 \ file_2.xml"/Salir debe devolver
/Importación
C: \ ruta \ file.xml (no me importa si se recorta las cotizaciones fuera o no)
C: \ PATH_2 \ file_2.xml
/Salir

terminé usando esta expresión de la rosca anterior:

(?<=")\w[\w\s]*(?=")|\w+|"[\w\s]*" 

Podría alguien por favor me ayude a modificarlo? ¡Gracias!

Respuesta

3

No lo he probado en C# pero VBA en Excel, pero podría ser útil. También cambié doble a quinta individual. De todos modos, aquí está la expresión regular

Texto:

/actualización del valor setting0 = 'nuevo valor'/Guardar

Regexp:

('{1}(\w|\s|:|\\|\.)+'{1}|\w)+ 

Resultado:

actualización

setting0

valor

'nuevo valor'

Guardar

Texto:

/Importar 'C: \ ruta \ archivo. xml '' C: \ path_2 \ f ile_2.xml'/ Salir

Resultado:

importación

'C: \ ruta \ file.xml'

'C: \ PATH_2 \ file_2.xml'

Salir

+0

Esto funciona perfectamente una vez que reemplacé las comillas simples con dobles en la expresión. ¡Gracias por una solución tan concisa! – Tara

+0

('{1} (\ w | \ s |: | \\ | \.) +' {1} | (/ | \ w)) + esta versión debe devolver \ Importar en lugar de Importar. Acabo de cambiar \ w a (/ | \ w) al final de la expresión regular. –

+0

Sí, sí, acabo de hacer un ajuste a esto que hace lo mismo y lo probé: ... | (/? \ W) + – Tara

0

Este es un problema que, en general, no se puede resolver con expresiones regulares. En su lugar, se puede escribir un programa de análisis simple que lleva una línea, la lectura de cada personaje, a continuación, cuando se encuentra con un espacio y no estar dentro de un presupuesto, se necesita la subcadena actual y lo agrega a una lista:

public static string[] ParseLine(string line) 
     { 
      var insideQuotes = false; 

      var parts = new List<string>(); 

      var j = 0; 

      for (var i = 0; i < line.Length; i++) 
      { 
       switch (line[i]) 
       { 
        case '"': 
         insideQuotes = !insideQuotes; 
         break; 
        case ' ': 
         if (!insideQuotes) 
         { 
          parts.Add(line.Substring(j, i - j)); 
          j = i + 1; 
         } 
         break; 
        default: 
         continue; 
       } 
      } 

      return parts.ToArray(); 
     } 

Nota sin embargo, esto no se manejará como comillas escapadas dentro de las comillas.

0

Esta funciona si hay un número par de dobles comillas y sin comillas escapó:

^ 
\s* 
(?: 
    (?: 
     ([^\s"]+) 
     | 
     "([^"]*)" 
    ) 
    \s* 
)+ 
$ 
0
var matches = Regex.Matches("/Update setting0 value=\"new value\" /Save", "\\G(?:(\"[^\"]*\"?|[^ \"]+)|[ ]+)"); 

foreach (Match match in matches) { 
    foreach (Capture capture in match.Groups[1].Captures) { 
     Console.WriteLine(capture); 
    } 
} 

Si desea no tener las comillas (por lo "new value" se convierte en new value)

var matches = Regex.Matches("/Update setting0 value=\"new value\" /Save", "\\G(?:\"(?<1>[^\"]*)\"?|(?<1>[^ \"]+)|[ ]+)"); 

El ? después de la segunda \" es atrapar cotizaciones sin cerrar.

0

Solo mi versión modificada de lo que eulerfx publicó. Este:

Debe producir los resultados solicitados en la pregunta original (por lo que es "sobre el tema").

No incluye cotizaciones en los resultados

No incluye espacios en blanco sólo en resultados

Splits resultados en cualquier espacio en blanco no dentro cita

manijas faltan extremo cita de simplemente agregue lo que sobra después del ciclo

Recorta los resultados, a menos que haya comillas internas.

Lo hice principalmente para analizar las 2 últimas partes de cada línea de un resultado de la lista IMAP.

public static string[] ParseLine(string line) 
    { 
     var insideQuotes = false; 
     var start = -1; 

     var parts = new List<string>(); 

     for (var i = 0; i < line.Length; i++) 
     { 
      if (Char.IsWhiteSpace(line[i])) 
      { 
       if (!insideQuotes) 
       { 
        if (start != -1) 
        { 
         parts.Add(line.Substring(start, i - start)); 
         start = -1; 
        } 
       } 
      } 
      else if (line[i] == '"') 
      { 
       if (start != -1) 
       { 
        parts.Add(line.Substring(start, i - start)); 
        start = -1; 
       } 
       insideQuotes = !insideQuotes; 
      } 
      else 
      { 
       if (start == -1) 
        start = i; 
      } 
     } 

     if (start != -1) 
      parts.Add(line.Substring(start)); 

     return parts.ToArray(); 
    } 
Cuestiones relacionadas