Entwickler-Ecke

Basistechnologien - Kann mir jemand bei RegEx aushelfen?


BlackMatrix - Do 07.01.10 22:27
Titel: Kann mir jemand bei RegEx aushelfen?
Eigentlich bin ich gut informiert in Sachen Regular Expressions, aber irgendwie finde ich gerade nicht die Lösung für mein Problem.

Ich möchte gerne

Zitat:
Meine RegEx:


C#-Quelltext
1:
benutzer=[\w|=|&]+(^abcdef))                    


Es soll z.B. "benutzer=hans" aufführen, aber "benutzer=abcdef" nicht finden, dabei darf aber [\w|=|&] nicht verändert werden.
Ist das überhaupt möglich in einem Schritt zu machen?


Kha - Do 07.01.10 22:46

"^" gibt es nur bei Character Classes, was du suchst, nennt sich lookahead [http://www.regular-expressions.info/lookaround.html].


BlackMatrix - Sa 09.01.10 01:53

Gibt es eine allgemeine Methode um strings zu URL Encoden?

Also aus einem "?" ein "\?" machen, aus einem "." ein "\."?


Kha - Sa 09.01.10 15:19

Ich will erst gar nicht wissen, wie du auf "URL" kommst :P .

Regex.Escape


BlackMatrix - Sa 09.01.10 16:04

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Ich will erst gar nicht wissen, wie du auf "URL" kommst :P .

Regex.Escape


;)

Vielen Dank :-P

Wo liegt denn hier der Fehler? Kann ich keine Veroderung von Regex machen? Ich könnte zwar nacheinander prüfen, aber kann man auch "gleichzeitig" prüfen?


C#-Quelltext
1:
2:
3:
4:
string treffer = 
(Regex.Match(text, patter1.Value) 
||
(Regex.Match(text, patter2).Value);


Und kann gibt es für strings die Methode

"&" in "&"
"<" in "&lt;"
">" in "&gt;"

zu konvertieren?

Ich hoffe ich nerve nicht^^

MfG BlackMatrix
Moderiert von user profile iconChristian S.: Quote- durch C#-Tags ersetzt


Kha - Sa 09.01.10 16:59

user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
Kann ich keine Veroderung von Regex machen?
Nein, aber warum das "oder" nicht gleich in den Regex einbauen?

user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
Und kann gibt es für strings die Methode

"&" in "&amp;"
"<" in "&lt;"
">" in "&gt;"

zu konvertieren?
Da das nicht mehr zum Thema gehört, sag ich mal nur so viel: Suche bei Google C# HTML ENCODE :zwinker: .


BlackMatrix - Sa 09.01.10 17:25

Ich wusste nicht wie es im Patter geht, deswegen hatte ich gehofft, dass man das vielleicht auch so machen kann, aber nun habe ich es hinbekommen und danke für den HTMLEncoding Tipp.

Mein C# Wissen vergrößert sich :-P


BlackMatrix - Sa 09.01.10 18:27

Eine Frage hätte ich dann noch ;)

Eine MatchCollection ist ja schreibgeschützt, also könnte ich z.B. folgendes nicht tun?


C#-Quelltext
1:
MatchCollection benutzer = Regex.Matches(text, patter).Replace("&","&");                    


Das müsste ich dann erst im nachfolgenden oder vorherigen Schritt tun, richtig?


Kha - Sa 09.01.10 18:49

user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
Eine MatchCollection ist ja schreibgeschützt
Hat wenig damit zu tun, dass MatchCollection einfach keine Replace-Methode kennt... also ja, das wirst du erst beim Auslesen der einzelnen Strings machen können.


BlackMatrix - So 10.01.10 00:15

Gibt es die Möglichkeit Duplikate nicht mit in die MatchCollection aufzunehmen? Sozusagen, jeden Treffer nur einmal?


Kha - So 10.01.10 00:18

Da musst du erstmal "Duplikat" definieren, zwei Treffer an der gleichen Stelle wird's wohl nicht geben ;) .
Also: Nein, das wirst du beim Auslesen wieder selbst machen, am besten über ein Set<T> (wenn man nicht gleich mit LINQ kommen will).


BlackMatrix - So 10.01.10 00:21

Wow antwortest du schnell :)

Mit Duplikat meinte ich, dass die MatchCollection nicht 2x den gleichen Treffer übernimmt.

"benutzer=12345" sollte nicht 2x in der MatchCollection stehen.

LINQ würde ich erstmal nach hinten schieben ^^ Kannst du Set<T> genauer definieren?


Kha - So 10.01.10 00:26

Sorry, das sollte eigentlich HashSet<T> heißen ;) (3.5+).


BlackMatrix - So 10.01.10 01:02

Hat bisschen gedauert, aber klappt wunderbar =)

Äh, eine Frage hätte ich aber dennoch, wie greife ich auf das Hashset zu?

C#-Quelltext
1:
2:
3:
            HashSet<string> hashset = new HashSet<string>();
            for (int i = 0; i < mc.Count; i++)
                    hashset.Add(mc[i].Value);


hashset[1] funktioniert nicht so ganz^^

edit: :( Hätte ich einen neuen Thread aufmachen sollen?

Okay habs, ganz schön viel Code, nur um so doppelte Einträge aus der MatchCollection rauszuholen.

Ich nehme mal an, dass man es so zu machen hat. Falls es mit weniger Code oder einfacherer geht, kann mir gerne bescheid gegeben werden :)

C#-Quelltext
1:
2:
3:
4:
5:
            HashSet<string> hashset = new HashSet<string>();
            for (int i = 0; i < mc.Count; i++)
                    hashset.Add(mc[i].Value);
            string[] benutzer = new string[hashset.Count];
            hashset.CopyTo(benutzer);


Kha - So 10.01.10 01:45

Da HashSet IEnumerable<T> implementiert, bietet sich eine foreach-Schleife an :) . Ansonsten könnte man deinen Code auch durch .ToArray() ersetzen, auch wenn das genau genommen schon unter LINQ fällt :zwinker: .


BlackMatrix - So 10.01.10 02:26

Also ich hab mal Linq eingebunden, aber ehrlich gesagt, bin ich jetzt ein wenig überfragt, der Code von oben hat zwar funktioniert, aber ich wollte es mal noch probieren wie du es mir jetzt vorgeschlagen hast.

Ich dachte irgendwie so, aber das sind bestimmt immer noch viel zu viele Zeilen(außerdem funktioniert es nicht, ich kann irgendwie mit dem Rückgabewert (Erweiterungen) von .toarray nichts anfangen :-/


C#-Quelltext
1:
2:
3:
4:
5:
            HashSet<string> hashset = new HashSet<string>();
            foreach (string element in mc)
                    hashset.Add(element);
            string[] benutzer = new string[hashset.Count];
            benutzer = hashset.ToArray<string>;


letzte Zeile passt nicht.


Kha - So 10.01.10 02:32

user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
außerdem funktioniert es nicht, ich kann irgendwie mit dem Rückgabewert (Erweiterungen) von .toarray nichts anfangen :-/
Ist ein ganz normales Array ;) ?


C#-Quelltext
1:
string[] benutzer = hashSet.ToArray();                    


BlackMatrix - So 10.01.10 02:35

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
außerdem funktioniert es nicht, ich kann irgendwie mit dem Rückgabewert (Erweiterungen) von .toarray nichts anfangen :-/
Ist ein ganz normales Array ;) ?


C#-Quelltext
1:
string[] benutzer = hashSet.ToArray();                    


So einfach hatte ich das nicht probiert^^


BlackMatrix - So 10.01.10 14:28

Um wieder aufs Thema zurückzukommen, kann ich einen String auch nach einer Variable prüfen lassen?


C#-Quelltext
1:
2:
3:
string variable = "test";

MatchCollection mc = Regex.Matches(text, //und hier möchte ich nun, dass mein Patter neben [:|&|\w]+ auch auf die variable prüft und darf aufgenommen werden, wenn sie 0x oder 1x vorkommt);


Wenn das möglich wäre, wäre das genial :)

Ich hatte an so etwas gedacht, was natürlich nicht funktioniert^^


C#-Quelltext
1:
string patter = @"(?<=['|""])" + (url)? + restpatter";                    


Kha - So 10.01.10 15:02

user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
string patter = @"(?<=['|""])" + (url)? + restpatter";                    
Du musst schon trennen, was hier C#-Bezeichner/Operatoren sind und was zum Regex gehört.

C#-Quelltext
1:
string pattern = @"(?<=['|""])(" + url + ")?" + restpattern; // + ggf. Regex.Escape                    

Wobei sich hier string.Format anbietet.

PS: "Pattern" ist kein Plural und "Patter" davon sicher nicht die Einzahl... so einen hatten wir doch schon einmal *g* .


BlackMatrix - So 10.01.10 15:06

Stimmt, jetzt wo du das schreibst, macht das Sinn ;)

Das die Syntax falsch war, war mir bewusst, aber ich dachte ich schreibe es mal so wie in etwa es aussehen sollte, dadurch war vielleicht der Sinn besser zu erkennen.

edit: und wieder 4 Zeilen Code erspart, ich hatte es nämlich mit Hashset nachbearbeitet. Danke dir =)