Domanda

sto cercando di ottenere le informazioni di colore che ho memorizzato in un file di testo e quindi utilizzare tale colore come il ForeColor per un'etichetta. MA, in fase di esecuzione quando scatto il tasto per farlo, mi doesnt dare eventuali messaggi di errore o altro. il codice che ho è di seguito:

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);

E ho altre espressione regolare per gli altri file informazioni inn troppo, ma l'altro regex è neanche il problema. il problema è l'espressione regolare che ho appena aggiunto per cercare di abbinare un colore (ARGB). è alla fine della stringa:

\r\n(\d+?)

Quindi, per quanto mi risulta, quanto sopra piccola cosa regex significa questo: "Trovare un CarriageReturn e ritorno a capo, e poi 1 o più cifre ma non lo essere avidi". è giusto?

qualcuno può please help me con questo. vi ringrazio molto.

Nota: Le informazioni di colore che viene salvato nel file di testo è un numero negativo (colore ARGB):

-16744193

Il contenuto del file è in questo modo:

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

Spiegazione:

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

Quindi, le opere regex, prende tutti gli altri dettagli in modo corretto, ma semplicemente non ottiene le informazioni sul colore.

È stato utile?

Soluzione

Il tuo regex è non il problema. La vostra espressione regolare così come quella data da Wim funziona bene. Quindi il problema deve essere con il modo in cui l'ingresso viene gestita.

Qui ci sono alcune cose che puoi provare:

Esegui questo con ingresso differente, cioè invece di utilizzare questo numero:

-16744193

Usa qualcosa come questo, invece:

100
-100

Poi stampare il valore dopo questa riga:

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

E vedere quello che è.

Un'altra cosa per risparmiare tempo si dovrebbe fare è stampare i valori in

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

E li postare qui. In questo modo sarà più facile per voi così come ogni in modo da vedere quale sia il problema.

Altri suggerimenti

- non corrisponde \d. Inoltre, se si fa un match non avido sul \d+ solo la prima cifra sarà catturata dal momento che soddisfa l'espressione regolare. Cambia la tua espressione regolare in (-?\d+) per abbinare un - opzionale all'inizio del proprio numero e il maggior numero di cifre come ci sono in numero, fino a (ma non compreso) il carattere che segue il numero (newline, end-of-string, .. .).

Prova questo regex e vedere se funziona.

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

Il tuo regex sembrava essere alla ricerca del "dopo il valore dimensione del carattere.

Inoltre, il vostro colore ARGB sarà nel match del gruppo 7, non 5.

Mi piacerebbe impostare un punto di interruzione sulla linea con l'errore e vedere cosa match.Groups[5].Value realmente è.

Sto scommettendo che non può essere convertito in un int.

La stampa i valori partita come suggerito altrove sarebbe un aiuto, così come abbreviare il regexp per rendere più facile per isolare il problema.

Ma posso suggerire un'altra cosa. Ecco l'ultima parte del regexp a partire dalla partita dimensione del carattere:

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

che dovrebbe corrispondere contro

...
14.0
-55794414

Dal momento che hai la partita per il ritorno a capo subito dopo la partita per le cifre delle dimensioni dei caratteri, la partita avrà esito negativo se si dispone di uno spazio dopo 14,0. Prova con

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

che dovrebbe funzionare con e senza spazi finali. (A seconda del motore di espressioni regolari, basta "\s*" potrebbe essere migliore di "\s*\r\n".)

In realtà ci sono un sacco di altre cose che potrebbero andare male. E 'generalmente più facile per dividere le corde e lavorare con espressioni regolari più piccoli.

Credo che si conosce già la citazione?

  

Alcune persone, quando si confronta con un   problema, pensa "Lo so, io uso   espressioni regolari ". Ora che hanno   due problemi.

Hai solo 4 gruppi della tua espressioni regolari, ma si sta cercando di gruppi di accesso da 5 a 8 che saranno stringhe vuote, e una stringa vuota non può essere analizzato come un intero da Int32.Parse.

È possibile utilizzare questa espressione regolare:

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

Un esempio di utilizzo da cui si può vedere che funziona:

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);

In questo esempio abbiamo 2 etichette con colori diversi, come si può vedere l'espressione regolare corrisponde ai colori.

I gruppi di regex:

  • 0 : controllo
  • 1 : testo
  • 2 : X
  • 3 : Y
  • 4 : Font
  • 6 : Dimensione
  • 7 : Colore
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top