Laden...

Allgemeines zu Regex(Vorteile, Nachteile, eure Erfahrungen usw)

Letzter Beitrag vor 17 Jahren 17 Posts 4.310 Views
Allgemeines zu Regex(Vorteile, Nachteile, eure Erfahrungen usw)

hallo,
hab mich heut das erstemal mit Regex (Regulary Expressions) befasst. Ist eine nette Sache, mit der man viele Probleme lösen kann. Jetzt wollt ich einfach mal von euch wissen, was eure Erfahrungen sind, welche Vor- und Nachteile ihr gesammelt habt.

Ein Arbeitskollege hat heut gemeint, dass er damit weniger gute Erfahrungen gemacht hat, vor allem im Bereich Perfmormance bei Anwendungen die dauerhaft laufen. Er meint für die definierten Aufgaben ist es besser eine Klasse(n) zu entwickeln, die halt nur die eine Aufgabe löst und nich für 1.000 andre variante konzipiert bzw. leisten kann. Wie seht ihr das?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Hatte auch schonmal das Problem das nen Regex zum Suchen eines Strings nen Flaschenhals in nem Algorithmus war. Nen einfaches Iterieren über alle Zeichen des Strings hat zigmal bessere Performance gebracht.

Aber da war der Regex einfach falsch eingesetzt, sobald es um komplexe Ausdrücke geht, kommt man kaum um Regex rum. Und wenn der Ausdruck feststeht und man den Regex kompilieren lässt statt den Ausdruck dynamisch auszuwerten, dann ist das auch verdammt schnell.

Baka wa shinanakya naoranai.

Mein XING Profil.

Hallo kleines_eichhoernchen,

ich benutze Regex viel und hatte noch nie nennenswerte Performance-Probleme. Performance-Probleme gibt es eigentlich nur, wenn man Pattern, die massives Backtracking durchführen, aber letztendlich doch nicht matchen, auf lange Input-Texte angewendet.

Wenn ausprogrammieren schneller ist als Regex, dann normalerweise deshalb, weil der ausprogrammierte Code nicht mehr die volle Flexibilität des Regex-Pattern hat. In diesen Fällen ist ein Regex-Pattern, der genau dem ausprogrammierten Code entspricht, einfacher und vermutlich schneller.

herbivore

Die Performance deiner regex hängt sehr stark vom verwendeten Pattern ab. Bei einfachen Patterns sind regex zum Teil schneller als eine einfache Suche mit mehreren Alternativen(z.B.: string.StartsWith("asd") || string.StartsWith("fdgd")). Bei komplexen Patterns wie "(x+x+)+y" können regex ein exponentielles Verhalten aufweisen.

Original von herbivore
Performance-Probleme gibt es eigentlich nur, wenn man Pattern, die massives Backtracking durchführen, aber letztendlich doch nicht matchen, auf lange Input-Texte angewendet.

könntest du dazu vllt. ein kleines Beispiel schreiben? ich bin da leider noch frischling... Hab heut erst damit angefangen mic reinzulesen und ein paar kleinere Umstzungen zu machen.

Ich benutze grad Regex um bestimmte Dinge, die komplett als Text in unterschiedlichen Schreibweisen und kombinationen Dinge wie Finanzierung, Nummer, Größen, auszulesen. Benutze dazu Gruppierung, um diese Werte einzeln auszulesen und diese dann weiter zu verarbeiten.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Probier mal "(x+x+)+y" als Pattern und beginn bei x dann xx, xxx, ..., als Suchstring bis nichts mehr geht.

und damit kann ich mein System auslasten? das würde doch auch einfacher gehn...


byte[] arr =  new byte[2 * 1024 * 1024 * 1024 -1];
for (int fi = 0; fi < arr.length; fi++)
{
   arr[fi] = fi % 128;
}

Und was habt ihr sonst so für Erfahrungen gemacht? oder vllt. Nützliche Tips bzw. auf welche Grenzen seit ihr gestoßen?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

ich hab mir regex vor 3-4jahren beigebracht (damals noch für MSL - mirc scripting language ;D)
regex benutz ich sehr viel da es einfach die beste methode ist um strings auf zeichen zu überprüfen und gefundene resultate sofort zu verarbeiten (MatchCollection + Regex.Matches und mit nem foreach alles durchgehen)

beispiel: zb bei formularen ob eine vom syntax her passende email adresse eingegeben wurde oder zb wenn man ne IP adresse überprüfen will

oder in msl hatte ich mir mal einen regex geschrieben das alle html tags aus einem string löscht und somit ich den reinen text hatte.

es lohnt sich auf jedenfall sich das ganze beizubringen:

Regex tutorial einfach mal durcharbeiten. im grunde is regex in allen sprachen mit kleinen abweichungen gleich

mfg

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.

Regex an sich hab ich heut "durchgearbeitet" bzw. das was ich brauchte gefunden und erfolgreich eigen umgesetzt. Mir gehts nich unbedingt um ein Tutorial. Sondern halt um ein paar Erfahrungen, für was ihr Regex einsetzt bzw. eingesetzt habt. Ich weiß das Regex viele Möglichkeiten hat.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Mit der Performance kann man bei Regex auch bisschen tricksen, indem man je nach Situation den Regex kompiliert. (Wenn man den Regex mehrmals braucht)

Ich benutze Regex immer, wenn die normalen string-Funktionen nicht mehr ausreichen. Das sind dann beispielsweise:

  • einen String auf korrektes Format testen
  • in einem String nach speziell formatierte Sequenzen suchen/ersetzen
  • einen formatierten String in seine Bestandteile zerlegen um diese weiterzuverarbeiten (Stichwort Gruppen)

Es gibt bessere Methoden um seine Zeit totzuschlagen als Regex-Funktionalität nachzuprogrammieren. Gerade mit der Begründung Performance... einen Regex für die meisten Probleme hat man innerhalb von Minuten aufgesetzt und getestet. Für eine spezielle Funktion braucht man für nichttriviale Probleme (die, die nicht mit Stringbefehlen lösbar sind) schon leicht mehrere Tage.
Es kostet einen also quasi nichts erstmal mit nem Regex anzufangen, und sich um Performanceprobleme zu kümmern, wenn sie auftreten. Meist werden sie nicht auftreten.

e.f.q.

Aus Falschem folgt Beliebiges

Wie sieht es us mit der Verständlichkeit solcher Umsetzungen. Also wenn ihr zum Bleistift im Inet ein Regex findet (mehr oder weniger Komplex), habt ihr dann Probleme das zulesen, bzw. zu verstehen, für was der Regex da ist? Wenn ich einen fremden Regex sehe interessiert mich der nich wirklich, kann mit fremden implementierungen nix anfangen.

Mit der Performance kann man bei Regex auch bisschen tricksen, indem man je nach Situation den Regex kompiliert. (Wenn man den Regex mehrmals braucht)

Und wie sieht das aus? Ich hab immer


Regex reg = new Regex(@"REGEXSTRING");
usw...

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Original von kleines_eichhoernchen
Wie sieht es us mit der Verständlichkeit solcher Umsetzungen. Also wenn ihr zum Bleistift im Inet ein Regex findet (mehr oder weniger Komplex), habt ihr dann Probleme das zulesen, bzw. zu verstehen, für was der Regex da ist? Wenn ich einen fremden Regex sehe interessiert mich der nich wirklich, kann mit fremden implementierungen nix anfangen.

ich guck mir regexen immer an, da man so auch evtl dazulernt (deswegen liest man ja auch die threads im forum ;D). idR hab ich eigtl keine probleme damit regexe zu verstehen. kommt halt immer darauf an, wie lange man sich schon mit der materie befasst.

zum 2.)
ich setz den pattern immer direkt in die if mit rein bzw ins IsMatch oder was ich halt brauch, also im grunde so wie du
performance probleme hab ich noch keine bemerkt.

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.

Ich selber hab auch noch keine Performanceprobleme gehabt. Nur ein Kollege hats halt gemeint. Und weil ich gerade ein Programm schreibe, das ein Datenbank-Export (CSV-Datei) einlesen soll und in unsere Datenbank importieren soll. Da nun aber das einige viele Datensätze sein können und ich für das Auslesen teillweise Regexxe benutze bzw. benutzen muss, hab ich halt da kleine bedenken.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Hallo kleines_eichhoernchen,

CSV ist nun gerade ein Beispiel, wo man keinerlei Performance-Probleme befürchten muss, wenn, ja wenn man RegexOptions.Mulitline, aber nicht RegexOptions.Singleline verwendet. Oder anders ausgedrückt, wenn man das Backtracking auf jeweils eine Zeile beschränkt. Aber selbst wenn man das nicht tut, heißt das noch nicht, dass man automatisch Performance-Probleme bekommt.

So oder so würde ich mir um Performance-Probleme keine Gedanken machen. Meistens treten sie nicht auf und wenn doch, kann man sich immer noch drum kümmern.

herbivore

Ne, das mit CSV-Zeilen ist kein Problem. Es werden halt nur 10.000 und mehr Datensätze ausgelesen und bei jedem Datensatz wird Regex gebraucht, aber auch nur bei bestimmten.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Und was ist mit

csv zeile für zeile auslesen

Aber was ist wenn man zum Beispiel (Eine Zeile aus einer CSV-Datei)

"Audi"; "A4"; "Variant"; "Und hier folgt ein weiteres Array enthalten sind auch ; sowie auch ""Doppelanführungszeichen"";"Blau"; "usw..."

Gibts dafür eine "simple"-Lösung?

Hätte jemand eine Idee wie das grob in Regex aussehen könnte?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

bitte jetzt nix durcheinander schmeissen!
hier gehts es um grundsätzliche fragen zu regex.

und mit dem konkreten beispiel bitte in dem entsprechenden thread posten!!

danke

?( wer suchet, der findet auch! :]