Entwickler-Ecke

Basistechnologien - Regex brauche Hilfe


_Joe_ - Mi 08.04.09 20:52
Titel: Regex brauche Hilfe
Hallo,

irgend sehe ich denn Wald vor lauter bäumen nicht.

mein String:
"-0.5 -0.18575 0.0125;";"0.5 0.18575 0.0125;";"0.5 -0.18575 0.0125;";"0.5 -0.18575 0.009000001;";"-0.5 -0.18575 0.009000001;";"-0.5 -0.16425 -0.0125;";"0.5 0.18575 -0.0125;";"-0.5 0.18575 -0.0125;";"-0.5 0.18575 0.0125;";"0.5 -0.16425 -0.0125;";

daraus sollen double werte werden. So sieht mein Ansatz aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
   List<double> blub(string content)
        {
            List<double> mylist = new List<double>();
            Regex regular = new Regex(????????????);
            foreach (string ss in regular.Split(content))
            {
                mylist.Add(Convert.ToDouble(ss));
            }

            return mylist;
        }


Kann mir vielleicht jemand bei dem regulären Ausdruck helfen?


Moderiert von user profile iconKha: Topic aus IO, XML und Registry verschoben am Mi 08.04.2009 um 23:29


Kha - Mi 08.04.09 23:25

"helfen" ist gut, wenigstens ein Ansatz wäre schön gewesen :nixweiss: . Mit

Quelltext
1:
("(...);";)+                    

und Regex.Match hättest du schonmal die Double-Dreierpacks in Groups[2].Captures. Jetzt musst du noch das ... durch einen Ausdruck für diese Packs ersetzen.


_Joe_ - Do 09.04.09 12:12

Kann man irgendwie nach einem Anführungszeichen suchen bzw. wie trage ich Anführungszeichen in einen Regulären Ausdruck ein?

dachte an sowas: Regex regu = new Regex(" |;";|" "); und dann eben immer splitten wenn ein Leerzeichen, ;"; oder Anführungsstriche kommen.

*edit*

Regex regu = new Regex(" |;\";|\" ") funktioniert nur nicht ich bekomme dann "\"-0.5" warum auch immer :nixweiss:

*edit*


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
      List<double> blub(string content)
        {
            CultureInfo en = new CultureInfo("en-US");
            List<double> mylist = new List<double>();
            content = content.Remove(content.Length - 3);
            content = content.Remove(01);
            Regex regu = new Regex(" |;\";\"");
            foreach(string ss in regu.Split(content))
            {
                mylist.Add(Convert.ToDouble(ss,en));
            }
            for (int i = 0; i < 12;i++)
            {
                Console.WriteLine(mylist[i]);
            }
            return mylist;
        }


hmm nicht schön aber funktioniert erstmal


bakachan - Do 09.04.09 13:20

Ich würde eher den Weg über Regex.Matches gehen anstatt zu splitten.

mit dem Regexpattern

Quelltext
1:
2:
([+-]*[0-9]+(.[0-9]+){0,1})
//editiert damit auch 0 gefunden wird


Da müsstest du eine MatchCollection zurückkriegen die jede double-Zahl als Match enthält (kannst du einfach per Schleife dann durchlaufen)


_Joe_ - Do 09.04.09 13:46

bei deinem Beispiel wäre die Null ein Problem weil immer . vorkommen muss und eine Nachfolge Zahl


Kha - Do 09.04.09 14:01

Um die Zahlen würde ich mich gar nicht kümmern, das soll double.Parse erledigen. Mein Ausdruck von oben wäre damit insgesamt

Quelltext
1:
("([^"]+);";)+                    

Die Captures von Gruppe 2 zerlegst du dann noch mit string.Split(null) an den Leerzeichen, fertig.


_Joe_ - Do 09.04.09 15:52

ich habe mal Kha sein beispiel ausprobiert dabei erhalte ich:


C#-Quelltext
1:
2:
            Regex reg = new Regex("(\"([^\"]+);\";)+");
            Match matches = reg.Match(content);


base {System.Text.RegularExpressions.Group} = {"-0.5 0.03 0;";"0.1 0.03 0;";"-0.09999999 -0.03 0;";"0.5 -0.03 0;";}

Ich glaube das ist nichts ganz was du damit bewirken wolltest.


Wenn ich bakachan sein Beispielt ausprobier bekomme ich irgendwann eine Menge {0 0}.

Gibt es eine brauchbare Seite die, die Syntax der Regulären Ausdrücke beschreibt?


bakachan - Do 09.04.09 15:59

user profile icon_Joe_ hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich bakachan sein Beispielt ausprobier bekomme ich irgendwann eine Menge {0 0}.

Seltsam wenn ich das durch Regex-Lab jage (mit dem textbeispiel von dir oben) hab ich genau für jede double-Zahl nen Match in der Collection


Hier nen Regex-Tutorial:
http://www.mycsharp.de/wbb2/thread.php?threadid=41009


Kha - Do 09.04.09 16:17

user profile icon_Joe_ hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube das ist nichts ganz was du damit bewirken wolltest.
Doch, wahrscheinlich schon ;) . Mein Regex matcht ja den gesamten Text, danach musst du den Match wie schon zweimal beschrieben noch zerlegen.


_Joe_ - Do 09.04.09 19:32

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
user profile icon_Joe_ hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich bakachan sein Beispielt ausprobier bekomme ich irgendwann eine Menge {0 0}.

Seltsam wenn ich das durch Regex-Lab jage (mit dem textbeispiel von dir oben) hab ich genau für jede double-Zahl nen Match in der Collection


Hier nen Regex-Tutorial:
http://www.mycsharp.de/wbb2/thread.php?threadid=41009


Das Beispiel ist nur raus gegriffen ich hab davon seitenweise in xml Dateien. Der Fehler tritt genau dann ein wenn eine Folge mit 0 0 kommt.
Danke schönes Tutorial.


Kha dir kann ich irgendwie nicht ganz folgen. :gruebel:

*edit*


C#-Quelltext
1:
("[+-]?[0-9]+([.][0-9]+)?");                    


So klappt es Danke euch beiden :zustimm: