Pregunta

Estoy tratando de obtener información de color que he almacenado en un archivo de texto y luego usar ese color que el color de primer plano de una etiqueta. PERO, en tiempo de ejecución cuando hago clic en el botón para hacerlo, soy yo NO DA ningún mensaje de error ni nada. el código que tengo es a continuación:

MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)""\r\n(\d+?)");
        foreach (Match match in lines)
            int color = Int32.Parse(match.Groups[5].Value);

También tengo otras expresiones regulares para otros archivos de información posada también, pero la otra expresión regular no es el problema. el problema es la expresión regular que acaba de agregar para tratar de igualar un color (ARGB). que es al final de la cadena:

\r\n(\d+?)

En lo que a mi entender, la pequeña cosa expresión regular anterior significa esto: "Encuentra una CarriageReturn y salto de línea, y luego 1 o más dígitos, pero no seas codicioso". es así?

Puede alguien por favor me ayude con esto. muchas gracias.

Nota: La información de color que se guarda en el archivo de texto es un número negativo (color ARGB):

-16744193

El contenido del archivo es la siguiente:

Control
Control Text
Control Location
Control Font Name
Control Font Size
Control Font Color

Explicación:

Label
"this is a label"
23, 77
Tahoma
14.0
-55794414

Por lo tanto, las obras de expresiones regulares, obtiene todos los demás datos correctamente, pero simplemente imposible encontrar la información de color.

¿Fue útil?

Solución

Su expresión regular es no el problema. Su expresión regular, así como la dada por Wim funciona bien. Así que el problema tiene que ver con la forma en que se está manejando la entrada.

Aquí hay algunas cosas que usted puede intentar:

Ejecutar este con diferente de entrada, es decir, en lugar de utilizar este número:

-16744193

Utilice algo como esto en su lugar:

100
-100

A continuación, imprimir el valor después de esta línea:

int fcolor = Int32.Parse(match.Groups[7].Value);

Y ver lo que es.

Otra cosa que ahorra tiempo que debe hacer es imprimir los valores en

match.Groups[1].Value
match.Groups[2].Value
match.Groups[3].Value
match.Groups[4].Value
match.Groups[5].Value
match.Groups[6].Value
match.Groups[7].Value
match.Groups[8].Value

Y publicarlos aquí. Esto hará que sea fácil para usted, así como cada turno al SO para ver cuál es el problema.

Otros consejos

- no se corresponde con \d. También, si lo hace un partido no expansivo en \d+ sólo el primer dígito será capturado ya que satisface la expresión regular. Cambiar su expresión regular en (-?\d+) para que coincida con un - opcional en el inicio de su número y los dígitos que hay en el número, hasta (pero no incluyendo) el carácter que sigue al número (nueva línea, al final de la cadena, .. .).

Probar expresión regular y ver si funciona.

(. +?) \ R \ n "" ([^ ""] +) "" \ r \ n (\ d +), \ s (\ d +) \ r \ n ([\ w \ s] . *) \ r \ n (\ d + \ d +) \ r \ n (- \ d +)

Su expresión regular parecía estar buscando el "después de que el valor de tamaño de fuente.

Además, su color ARGB estará en partido del grupo 7, no 5.

Me puse un punto de interrupción en la línea con el error y ver lo que realmente es match.Groups[5].Value.

Estoy apostando a que no se puede convertir a un int.

La impresión de los valores coinciden como se sugiere en otro lugar sería una ayuda, así como acortar la expresión regular para hacer más fácil aislar el problema.

Pero lo que puedo sugerir una cosa más. Aquí está la última parte de la expresión regular a partir del partido tamaño de la fuente:

..."(\d+\.\d+)\r\n(-?\d+)"

¿Qué se supone que va a contrastar

...
14.0
-55794414

Ya que tienes el partido por la nueva línea inmediatamente después del partido para los dígitos de tamaño de fuente, el partido se producirá un error si tiene un espacio después de 14,0. Pruebe con

..."(\d+\.\d+)\s*\r\n(-?\d+)"

que debe trabajar tanto con y sin espacios finales. (Dependiendo de su motor de expresiones regulares, simplemente "\s*" puede ser mejor que "\s*\r\n".)

En realidad, hay un montón de otras cosas que podrían salir mal. En general, es más fácil para dividir las cuerdas y trabajar con expresiones regulares más pequeños.

supongo que ya sabe la cita?

  

Algunas personas, cuando se enfrentan a una   problema, piensan "Yo sé, voy a utilizar   expresiones regulares." Ahora tienen   dos problemas.

Usted tiene sólo 4 grupos en sus expresiones regulares, pero que están tratando de grupos de acceso 5 a 8 que serán cadenas vacías, y una cadena vacía no se puede analizar como un entero por Int32.Parse.

Puede utilizar esta expresión regular:

@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)"

A ejemplo de uso de la que puede verse que funciona:

string value = @"Label
""this is a label""
23, 77
Tahoma
14.0
-55794414
Label
""this is a label""
23, 77
Tahoma
14.0
-55794415";

MatchCollection lines = Regex.Matches(
 value,
 @"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)");
var colors = new List<int>();
foreach (Match match in lines)
{
    colors.Add(Int32.Parse(match.Groups[7].Value));
}

CollectionAssert.AreEquivalent(new[] { -55794414, -55794415}, colors);

En este ejemplo tenemos 2 etiquetas con diferentes colores, como puede verse en la expresión coincide con los colores.

Los grupos de la expresión regular:

  • 0 : Control
  • 1 texto
  • 2 : X
  • 3 : Y
  • 4 : Font
  • 6 : Tamaño
  • 7 : Color
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top