Entwickler-Ecke

Basistechnologien - [RegEx] Zahl und Pfad aus String kopieren


Delete - Sa 26.07.08 18:04
Titel: [RegEx] Zahl und Pfad aus String kopieren
Hi,

Ich steh momentan auf dem Schlauch. Ich habe folgenden String in einer Datei die ich Zeilenweise auslese:


Quelltext
1:
2:
3:
4:
5:
6:
7:
File1=D:\bla\blub1.mp3
Title1=bla1 - blub1
Length1=154
File2=D:\bla\blub2.mp3
Title2=bla2 - blub2
Length2=196
...


Ich will jetzt von jedem File-Eintrag die Nummer (also File[1 bis n]) und den Pfad, nur bekomm ich das nicht hin. Mein Ansatz schaut so aus:


C#-Quelltext
1:
arrFile.Add(System.Text.RegularExpressions.Regex.Match(strFileLine, @"^File[0-9]*="));                    


Ich habe mir einige Tutorials angeschaut aber nichts konnte mir genau helfen.

Kann mir vllt jemand sagen wie der Ausdruck lauten muss das ich eben jeweils die Nummer und den Pfad bekomme !?

PS: Es geht nur um die Zeilen die mit "File" anfangen.

mfg


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Sa 26.07.2008 um 18:18


Christian S. - Sa 26.07.08 18:15

Der Ausdruck ist schonmal nicht schlecht. Aber um Gruppen zu bekommen, musst Du die entsprechenden Passagen in Klammern setzen! Außredem musst Du ja noch den Pfad auslesen:

Quelltext
1:
^File([0-9]*)=(.*?)$                    


Delete - Sa 26.07.08 18:21

Danke für den Tipp, leider bekomme ich dann nur im Array die werte:


Quelltext
1:
2:
3:
4:
5:
6:
{}
{File1=D:\bla\blub1.mp3}
{}
{}
{File2=D:\bla\blub2.mp3}
{}


Christian S. - Sa 26.07.08 18:30

Ein Blick in die Doku unter RegEx.Matches löst das Rätsel ...


Delete - Sa 26.07.08 22:14

OK habe nachgelesen und es mit MatchCollection und Match in einer foreach-Schleife gemacht. Jetzt bekomme ich aber garnichts mehr zurück. Entferne ich aus deinem Ausdruck das ^ und $, dann bekomme ich das zurück:


Quelltext
1:
2:
File1=
File2=


Was mach ich falsch ?


Christian S. - Sa 26.07.08 22:27

Ich kann Dir nicht helfen, wenn ich Deinen Sourcecode nicht kenne.


Delete - Sa 26.07.08 22:42


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
            StreamReader FileReader;
            string strFileLine;
            string strFileContent = "";
            string strFileContent1 = "";
            ArrayList arrFile = new ArrayList();
            ArrayList arrTitle = new ArrayList();
            ArrayList arrLength = new ArrayList();
            MatchCollection arrFile2 = null;

            FileReader = new StreamReader(File.OpenRead(strFileNameInput));

            while ((strFileLine = FileReader.ReadLine()) != null)
            {
                strFileContent += strFileLine + "\r\n";
            }

            switch (strFileExtInput)
            {
                case (".m3u"):
                    arrFile2 = Regex.Matches(strFileContent, @"^[^#EXT].*?$");
                    break;
                case (".pls"):
                    arrFile2 = Regex.Matches(strFileContent, @"^File([0-9]*)=(.*?)$");

                    break;
            }
               
            FileReader.Close();


            foreach (Match strFile in arrFile2)
            {
                strFileContent1 += strFile.Value.ToString() + "\r\n";
            }

            MessageBox.Show(arrFile2.Count.ToString());
            MessageBox.Show(strFileContent1);


Christian S. - So 27.07.08 11:24

Du musst den Regex als Multiline-Regex erstellen (schau Dir mal die möglichen Parameter beim Konstruktor an).

Außrdem hat ein Match eine für Dich viel geeignetere Eigenschaft als Value ;-)


Delete - So 27.07.08 14:58

Ahhhh jetzt hab ichs... wie du gesagt hast, mit Multiline und Match.Groups hab ichs hinbekommen :)

Besten Dank ;)