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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top