Regex zum Abgleichen ARGB Farbe (-44830298)
Frage
Ich versuche, Farbe Informationen zu bekommen, dass ich in einer Textdatei gespeichert haben und verwenden dann diese Farbe als forecolor für ein Label. ABER, zur Laufzeit, wenn ich auf die Schaltfläche klicken, es zu tun, es tut mir keine Fehlermeldungen oder sonst etwas. der Code ich habe, ist unter:
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);
Ich habe andere Regex für andere Infos inn Dateien auch, aber die anderen regex ist nicht das Problem. das Problem ist die regex, dass ich nur eine Farbe (ARGB), um zu versuchen hinzugefügt haben und anzeigen zu lassen. es ist am Ende der Zeichenfolge:
\r\n(\d+?)
So so weit wie ich es verstehe, die über wenig regex, was bedeutet das: „Finden Sie eine CarriageReturn und Newline und dann 1 oder mehr Stellen aber derzeit gierig sein“. ist das richtig?
Kann jemand mir bitte dabei helfen. ich danke Ihnen sehr.
Hinweis: Die Farbe Informationen, die in der Textdatei gespeichert wird, ist eine negative Zahl (ARGB Farbe):
-16744193
Der Inhalt der Datei ist wie folgt aus:
Control
Control Text
Control Location
Control Font Name
Control Font Size
Control Font Color
Erklärung:
Label
"this is a label"
23, 77
Tahoma
14.0
-55794414
Also, die Regex funktioniert, wird es alle anderen Details richtig, aber es funktioniert nicht nur die Farbinformationen erhalten.
Lösung
Ihre regex ist nicht das Problem. Ihre regex sowie derjenige gegeben von Wim funktioniert gut. Also das Problem mit der Art und Weise zu sein, hat der Eingang behandelt wird.
Hier sind einige Dinge, die Sie ausprobieren können:
Führen Sie diese mit unterschiedlichen Eingängen, das heißt, anstatt diese Anzahl mit:
-16744193
Verwenden Sie so etwas wie dieses stattdessen:
100
-100
Dann den Wert auszudrucken nach dieser Zeile:
int fcolor = Int32.Parse(match.Groups[7].Value);
Und sehen, was es ist.
Ein weiteres zeitsparendes, was Sie tun sollen, ist, die Werte auszudrucken 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
Und poste sie hier. Dadurch wird es Ihnen leicht, wie auch jeder auf SO zu sehen, was das Problem ist.
Andere Tipps
-
nicht durch \d
abgestimmt. Auch, wenn Sie eine nicht gierige Spiel auf \d+
tun nur die erste Ziffer wird die regexp da dies erfüllt erfasst werden. Ändern Sie Ihre regexp in (-?\d+)
eine optionale -
zu Beginn Ihrer Nummer zu entsprechen und so viele Ziffern wie es in der Zahl sind, bis zu (aber nicht einschließlich) das Zeichen nach der Nummer (Newline, End-of-string, .. .).
Diese regex Versuchen und sehen, ob es funktioniert.
(. +?) \ R \ n "" ([^ ""] +) "" \ r \ n (\ d +), \ s (\ d +) \ r \ n ([\ W \ s] *) \ r \ n (\ d + \ d +) \ r \ n (.? - \ d +)
erschien Ihr regex für den "nach der Schriftgröße Wert zu suchen.
Auch Ihre ARGB-Farbe in Gruppenspiel sein wird 7, nicht 5.
ich einen Haltepunkt in der Zeile mit dem Fehler gesetzt würde und sehen, was match.Groups[5].Value
wirklich ist.
Ich wette es kann nicht in einen int umgewandelt werden.
Ausdrucken der Übereinstimmungswerte wie an anderer Stelle vorgeschlagen würde eine Hilfe sein, sowie eine Verkürzung der regexp zu erleichtern, um das Problem zu isolieren.
Aber ich kann noch etwas vorschlagen. Hier ist der letzte Teil der regexp von der Schriftgröße begonnenes Match:
..."(\d+\.\d+)\r\n(-?\d+)"
Welche soll gegen übereinstimmen
...
14.0
-55794414
Da Sie das Spiel für die Neuen-Zeile unmittelbar nach dem Spiel für die Schriftgröße Ziffern haben, wird das Spiel nicht, wenn Sie ein Leerzeichen nach 14,0 haben. Versuchen Sie es mit
..."(\d+\.\d+)\s*\r\n(-?\d+)"
, die sowohl mit als auch ohne Leerzeichen funktionieren sollen. (Je nach regexp Motor, nur "\s*"
besser sein kann als "\s*\r\n"
.)
Es gibt tatsächlich eine ganze Reihe anderer Dinge, die schief gehen könnten. Im Allgemeinen ist es einfacher, die Saiten und die Arbeit mit kleineren regexps aufgeteilt.
Ich nehme an Sie bereits wissen, das Zitat?
Einige Leute, wenn sie mit einem konfrontiert Problem, denken: „Ich weiß, ich werde verwenden reguläre Ausdrücke.“Jetzt haben sie zwei Probleme.
Sie haben nur vier Gruppen in Ihrem regulären Ausdrücken, aber Sie versuchen, die Zugriff auf die Gruppen 5 bis 8, die leeren Zeichenfolge sein, und eine leere Zeichenfolge nicht als ganze Zahl von Int32.Parse analysiert werden.
Sie können diese regex verwenden:
@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)"
Ein Anwendungsbeispiel, aus dem ersichtlich ist, dass es funktioniert:
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 diesem Beispiel haben wir 2 Etiketten mit verschiedenen Farben, wie die Regex die Farben passen zu sehen ist.
Die Gruppen der Regex:
- 0 : Steuerung
- 1 : Text
- 2 : X
- 3 : Y
- 4 : Schrift
- 6 : Größe
- 7 : Farbe