2016-04-13 18 views
0

Ich habe eine Zeichenfolge, die eine Zeile von einem CSV ist. Diese Zeichenfolge enthält viele Werte, von denen ein ähnlichRegex Split verhält sich nicht wie erwartet

strukturiert ist

{X = 4535,12, Y = 4535,12} {X = 12345, Y = 12345} etc ...

Ich benutze regex diesen String aufgeteilt, aber noch nicht so weit gelungen, durch dieses Muster mit

/(({X=\d+\.\d+, Y=\d+\.\d+})|({X=\d+, Y=\d+})|({X=\d+\.\d+, Y=\d+})|({X=\d+, Y=\d+\.\d+}))+/g 

getestet habe ich diese auf einer Website und es entsprach den genauen Zeichenfolge ich und keine andere in einer großen Menge von Daten gesucht, aber als ich Bei der Aufteilung teilt der Split nur einen einzelnen Wert (die gesamte Zeichenfolge als einen)

Gibt es eine bestimmte Funktionalität von Split Ich vermisse, dass es sich anders als Standard-Matching verhält, oder ist mein Muster nur falsch?

Die Linie in C# liest sich wie so

string[] tempLine = System.Text.RegularExpressions.Regex.Split(line, @"/(({X=\d+\.\d+, Y=\d+\.\d+})|({X=\d+, Y=\d+})|({X=\d+\.\d+, Y=\d+})|({X=\d+, Y=\d+\.\d+}))+/g"); 
+0

möchten Sie die Koordinaten jeweils x, y? –

+0

Wie lautet die Codezeile in C#, auf der Sie die Aufteilung ausführen? Es kann eine funky Syntax haben – Isaac

+0

@BadroNiaimi Ich möchte das gesamte Ding vom Rest der Linie getrennt, es enthält Kommas, die entfernt werden sollten. –

Antwort

2

Zuerst Ihre regex zu kompliziert ist, können Sie es vereinfachen:

({X=\d+(?:\.\d+)?, Y=\d+(?:\.\d+)?}) 

Und hier ist der resultierende C# -Code:

string s = "{X=4535.12, Y=4535.12}{X=12345, Y=12345}"; 
string regex = @"({X=\d+(?:\.\d+)?, Y=\d+(?:\.\d+)?})"; 

var matches = Regex.Matches(s, regex); 
foreach (Match match in matches) 
{ 
    Console.Out.WriteLine(match.Value); 
    // Or whatever you want to do with any couple {X=something, Y=something} 
} 
+1

Ich würde '@" {X = [\ d.] +, \ S + Y = [\ d.] +} "' Regex verwenden. Die Gültigkeit der übereinstimmenden Gleitkommazahlen sollte hier kein Problem sein. –

+1

Dies ist nicht ganz das, was ich will, sorry, wenn ich nicht gut genug spezifiziert habe, möchte ich den gesamten Satz von Daten getrennt werden, so wenn die Daten wie ** Hallo waren, {X = 4535,12, Y = 4535,12 } {X = 12345, Y = 12345}, tschüss ** - Ich möchte ein Array mit drei Elementen [0] = "Hallo" [1] = "{X = 4535.12, Y = 4535.12} {X = 12345, Y = 12345} "[2] =" tschüss " –

+1

Vielen Dank für Ihre Hilfe, ich habe es geschafft, das zu ändern, indem ich dieses Muster ein kleines bisschen änderte, ich fügte '+' am Ende hinzu und machte dann das eigene Capturing-Gruppe so Es wurde alles zurückgegeben. Ich machte dann die Inside-Gruppe nicht-Capturing, um die Daten nur einmal zu bekommen - ich endete damit. ((?: {X = \ d + (?: \. \ D +) ?, Y = \ d + (?: \. \ d +)?}) +) ' –

0

versuchen

+0

Es ist nicht so viel Leerzeichen drin, es ist in 90% dieser Orte nicht notwendig, könnte wahrscheinlich bis zu^({X = (\ d + (\. \ D +)?) Vereinfachen, \ s * Y = (\ d + (\. \ d +)?)}) $ - das passt auch viel viel mehr als nur die angegebenen Daten –

+0

was ist mit Zahlen in Form .5 oder 12.? – Ali

1

Ich löste dieses Problem, indem diese Zeichenfolge Regex mit

((?:{X=\d+(?:\.\d+)?, Y=\d+(?:\.\d+)?})+) 

Dies ist eine leicht bearbeitete Version der Antwort @Thomas gab, und als solche will ich sein als die Antwort markieren, weil es mir geholfen die bei der Suche nach Lösung und seine Antwort ist allgemeiner und eher anderen mit diesem Problem zu helfen

Verwandte Themen