Entwickler-Ecke

Basistechnologien - Regex und String Problem


csharper - Di 14.10.08 11:27
Titel: Regex und String Problem
Hallöchen,

ich hab einen ganz langen String den ich nach Regulären Ausdrücken absuchen möchte.

nachdem ich schon einiges probiert habe, über Match , MatchCollections, etc. und nicht weiterkomme starte ich hier mal die Frage.

Wie sieht die Funktion aus um einen String nach Regulären Ausdrücken zu durchsuchen, diese auszufiltern und in eine List<string> einzufügen. Wie gesagt ich komm nicht weiter.

Hoffe das mir hier einer helfen kann.

Greetz


lothi - Di 14.10.08 14:24

Hallo

Ohne Worte:


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:
using System;
using System.Text.RegularExpressions;

public class Test
{

    public static void Main ()
    {

        // Define a regular expression for repeated words.
        Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b",
          RegexOptions.Compiled | RegexOptions.IgnoreCase);

        // Define a test string.        
        string text = "The the quick brown fox  fox jumped over the lazy dog dog.";
        
        // Find matches.
        MatchCollection matches = rx.Matches(text);

        // Report the number of matches found.
        Console.WriteLine("{0} matches found.", matches.Count);

        // Report on each match.
        foreach (Match match in matches)
        {
            string word = match.Groups["word"].Value;
            int index = match.Index;
            Console.WriteLine("{0} repeated at position {1}", word, index);   
        }
        
    }
    
}


Gruss Lothi


bakachan - Di 14.10.08 14:39
Titel: Re: Regex und String Problem
user profile iconcsharper hat folgendes geschrieben Zum zitierten Posting springen:
nachdem ich schon einiges probiert habe, über Match , MatchCollections, etc. und nicht weiterkomme starte ich hier mal die Frage.

Wie sieht die Funktion aus um einen String nach Regulären Ausdrücken zu durchsuchen, diese auszufiltern und in eine List<string> einzufügen.


Eigentlich hast du alles wichtige schon drinn MatchCollection und List<string>

Wenn du dir die Matches deines Regex als Matchcollection zurückgeben lässt kannst du diese per schleife durchlaufen und jeden treffer in deine Liste einfügen


C#-Quelltext
1:
2:
3:
4:
5:
List<string> result = new List<string>();
Regex regex = new Regex(strMuster);
MatchCollection matches = regex.Matches(strText);
foreach (Match match in matches)
    result.Add(match.Value)


csharper - Do 16.10.08 11:13

Hi,
eigentlich klappt es soweit, ich habe nur das Problem, dass ich meinen String nach dem Regex absuche, wenn dieser gefunden wird, soll 2 Zeichen vorgegangen werden und die Zeichen dazwischen bis zu einem definierten Endpunkt ausgegeben werden, also nicht der Regex, sondern das was darauf folgt.

Bis jetzt hab ich das folgendermaßen gemacht:


C#-Quelltext
1:
2:
3:
4:
5:
6:
                        int startindex = element.IndexOf(start) + start.Length + 2;
                        int endindex = element.IndexOf(end, startindex) - 1;

                        string id = element.Substring(startindex, endindex - startindex);

                        FilteredIDs.Add(id);


Das hab ich dann in foreach gehabt. Wie kann ich das auf MatchCollection und List<string> anwenden? Also wie kann ich nur die zeichen dazwischen ausgeben, IndexOf gibts ja nicht für MatchCollections.


csharper - Do 16.10.08 12:00

Hi,

hab meinen Regex angepasst und jetzt klappts ;-)

Man bin ich froh das es endlich so funktioniert wie ich möchte.

Danke an alle die mir geholfen haben

Greetz :lol:


bakachan - Do 16.10.08 12:05

Zitat:
meinen String nach dem Regex absuche, wenn dieser gefunden wird, soll 2 Zeichen vorgegangen werden und die Zeichen dazwischen bis zu einem definierten Endpunkt ausgegeben werden, also nicht der Regex, sondern das was darauf folgt.


Und warum das was darauf folgt und nciht der regex? das ist doch schwachsinn (sorry).

Such mit deinem Regex doch einfach direkt das was du brauchst.
Wenn das was davorsteht als bedingung gelten soll baust du in dein regex-muster einen Lookbehind und fertig.

z.B. wenn wir ab und zu in einem Text die Zeichenfolge "ABC" und danach 2 Zahlen haben und du die 2 Zahlen willst
Dann suchst du ja prinzipiell mit deinem Regex nach :
[0-9]{2} (also 0 bis 9 und das 2 mal)
jetzt noch der lookbehind der angibt das vorher die Zeichen folge ABC stehen muss :

(?<=ABC)[0-9]{2}
dieser Regex würde alle 2-stelligen zahlen matchen die nach der Zeichenfolge ABC kommen und im Value hättest du dann nur die 2stellige Zahl

anstelle der zahl kannst auch einfach .{2} machen dann haste 2 beliebige Zeichen


csharper - Di 21.10.08 11:39

Habs hinbekommen, danke danke