https://stackoverflow.com/questions/2453…f-work-on-regex
Da wird die Wirkungsweise von SKIP und FAIL genauer erklärt. Sehr interessant.
https://stackoverflow.com/questions/2453…f-work-on-regex
Da wird die Wirkungsweise von SKIP und FAIL genauer erklärt. Sehr interessant.
Es ging mir nicht mal um Optimierung, nur darum ob das die gleiche Wirkung hat.
Außerdem hab ich so mal die Wirkungsweise von Lookaround anschaulich demonstriert bekommen, wieder was dazugelernt, DANKE!
Nicht "Dein". "Unsere(s)".
Ich hätte bewusst einmal von Windows-Suchmuster, und einmal von PCRE-RegEx geschrieben, damit den Leuten auch nur ja klar ist, daß es in dem Tutorial eigentlich um eine andere Syntax geht.
Du kennst den Witz mit dem Deutschen, der sich in 'nem engl. Pub 'nen Steak bestellt, und dann ganz entsetzt auf den Koch starrt, der mit dem großen Küchenmesser auf ihn zu kommt?
Der Deutsche der, die deutsche Sprache im Hinterkopf, gefragt hat "Can i please become a Steak?"
Oft ist es besser, nichts ähnliches im Hinterkopf zu haben.
Zustimmung, für Fortgeschrittene kann das ein Weg sein. Ich arbeite zwar schon eine Weile mit RegEx, behelfe mir dann aber doch oft mit schnell zusammengeschusterten Ausdrücken, die warsch. suboptimal laufen (viel mehr Steps benötigen, als erforderlich). Trotzdem versuche ich auch immer wieder, tiefer in die Materie einzudringen, UND dein RegExp-Beispiel Ist dafür genau das Richtige . So hab ich mir auch diese Schritt für Schritt-Erklärungen vorgestellt.
Könnte man in Deinem Beispiel statt dem ersten Lookaround nicht einfach ein ^ verwenden?
Ein Lookaround "frisst" das abgefragte Zeichen nicht, soweit ich weiß? D. h., ein unmittelbar danach stehender String, der mit diesem Zeichen beginnt, kann trotzdem gefunden werden?
Ich denke, für das Erstellen eines wirklich guten Tutorials würde sich ein Wiki sehr gut eignen, da man dort Änderungen diskutieren und erfolgte Änderungen evtl. auch wieder zurücksetzen kann (wenn sie keine Verbesserung waren). Gibt's sowas hier?
Als beidseitiger Lehrersohn bin ich gebranntes Kind. Ich versuche gern, Laien solche technischen Dinge mit Vergleichen aus deren Lebensumfeld näher zu bringen (z.B. Aufbau und Arbeitsweise von Festplatte mit Buch vergleichen).
Dabei habe ich die Erfahrung gemacht, daß ein einmal falsch verwendeter Begriff das "den Ausführugen folgen können" komplett abreißen kann. Der falsche Begriff geistert dann oft noch lange durch die verständnislosen Nachfragen des Zuhörers, und macht ein vielfaches Mehr an (Erklärungs-)Arbeit notwendig (und verbraucht dabei evtl. die Konzentrationsfähigkeits-Reserven des Zuhörers), als man für das "vor dem Aussprechen nach dem exakten, richtigen Begriff suchen" benötigt hätte. Deshalb spreche ich da oft langsam und bedächtig, z.T. mit (Denk-)Pausen, um mir und dem Zuhörer die geleistete Erklär-/Verstehens-Arbeit nicht kaputt zu machen.
gepostete Pattern als Einstieg für eigene Lösungen - Da sehe ich das Problem, daß sich der Hund in den Schwanz beißt. Solange ich nicht selber auf die Lösung komme, fehlt mir potentiell das Wissen, um das RegEx eines anderen zu verstehen. Sonst wäre ich ja selber drauf gekommen. Deshalb würde es vor allem helfen, wenn man den Zusammenbau eines RegEx Schritt für Schritt beschreibt, und die dabei verwendeten Konstrukte (z.B. Backreferenzen) erklärt.
Da helfen auch die "Explanation"'s auf der Seite https://regex101.com/ rechts oben schon mal weiter. Für Optimierungen kann man übrigens die oben rechts über dem "REGULAR EXPRESSION"-Feld angezeigten steps zu Rate ziehen (je weniger Steps, desto schneller kann der Ausdruck verarbeitet werden).
Hinter den vereinfachten Suchausdrücken der Windows-Suche kann natürlich eine Art Übersetzer liegen, der daraus wieder reguläre Ausdrücke macht, aber für ein Tutorial über PCRE spielt das halt keine Rolle, weil es ein anderes Thema ist.
Ehe ich mich in die RegExe von anderen reindenke, kann ich sie auch selber schreiben. Ich verwende ungern Zeug, von dem ich nicht verstehe, wie es funktioniert. Deshalb schau ich mir auch oft die UDFs erst an, bevor ich sie verwende.
Dann ist wohl Groß- und Kleinschreibung und richtige Zeichensetzung auch Erbsenzählerei. wer läsenkann der, verstet ja auchso was ich sagen will.
Außerdem reden wir hier nicht von Leuten, die sich mit RegEx-"Programmierung" schon auskennen, sondern von Anfängern (denen man es nicht schwerer machen muß, als nötig).
In einem PCRE-Tutorial ist *s??g.txt kein gültiger RegEx-Ausdruck. Anfänger tragen von dem Beispiel an evtl. die Aussage weiter mit sich rum, daß ? für "ein Zeichen" stehe, und verstehen dann die nachfolgenden Erklärungen falsch, wundern sich, daß es bei ihnen nicht funktioniert - und geben evtl. auf.
Streng genommen beschreibt auch "zwei Buchstaben, gefolgt von einer bis vier Ziffern im Bereich von zwei bis fünf" eine Menge von Zeichenketten mittels bestimmter syntaktischer Regeln. Ist dann die menschliche Syntaximplementierung. Bringt einen Anfänger aber nicht weiter, wenn er gleichzeitig mit mehreren, ihm alle unbekannten Syntaximplementierungen konfrontiert wird. Man lernt auch nicht im gleichen Sprachkurs esperanto, spanisch, und portugiesisch gemischt.
eMail (einfach): - findet etwas, das aus größerer Entfernung einer email-Adresse ähnlich sieht, aber auch nur, wenn es ganz alleine in einer Zeile steht.
eMail RFC 3696: - matched nicht auf die gültige Adresse: "Abc@d ef"(t)@gmail.com (selbst wenn sie alleine in einer Zeile steht)
>> Schlechte Idee: E-Mailadressen mit regex prüfen
Wer prüft, ob das, was irgendwer irgendwo da draußen gefunden hat, 1. ohne syntaktische Fehler ist und 2. auch tatsächlich das findet, was behauptet wird?
Genau deshalb ist es eine schlechte Idee, hier jeden wahllos Fundstücke reinkippen zu lassen, die er im schlimmsten Fall mangels Kenntnissen nicht mal verifizieren kann.
Zu dem Tutorial :
"2.1Was ist ein Regulärer Ausruck?"
*s??g.txt mag in der Windows-Suche funktionieren, ein RegEx ist es aber nicht. -> * The preceding token is not quantifiable
Sowas zur Einführung zu gebrauchen, führt die Leute schon gleich am Anfang auf 'nen falschen Pfad. .*?s..g\.txt oder .*?s.{2}g\.txt wären passende RegExe.
3.5 Zeichenklassen
\d - "sucht nicht nach einer Zahl von 0-9. und \d\d sucht folglich auch nicht nach 2 aufeinanderfolgenden Zahlen." sondern nach 'Ziffern'.
Im weiteren Verlauf des Tutorials verwendet er dann auch die richtigen Begriffe, aber sprachliche Exaktheit ist eine der ersten Lektionen in der Ausbildung zum Lehrer. Wenn es dann etwas komplexer wird, und man dabei Begriffe falsch verwendet, bzw. vertauscht, geht das gewaltig nach hinten los.
Andy: Ich hab nicht gefragt, wozu die Slashes in den Ausdrücken sind. Dazu kannst Du diepfeile und Bitnugger "den Arm aus der Sonne zu legen".
Ich will nicht weiter stören. Kippt die irgendwo im Netz gefundenen RegExe in die Sammlung rein, bei Diskussionen nach dem Motto "Hab keine Ahnung, wozu die Slashes in den Ausdrücken sind, ABER ich hab mehr Postings als Du." bin ich falsch.
OK, bin raus. Wenn hier Postings mit Kompetenz gleichgesetzt werden, Kümmer ich mich in Zukunft nur noch um mein Zeug.
Ich meine das hier:
franzp: "Aber ich kapier das einfach nicht."
Alina: "Willkommen im Club !"
diepfeile: "Wofür sind die '/' am Anfang und am Ende? Zudem funktioniert das bei mir nicht, obwohl ich die '/' weggelassen habe und das fehlende 'z' ergänzt habe."
Bitnugger: "Wofür die '/' am Anfang und Ende sind, kann ich dir nicht sagen."
Klar könnt Ihr hier eine Sammlung machen, und die kann dann auch von Leuten genutzt werden, die überhaupt nicht verstehen, was sie da benutzen.
Allerdings werden die dann, wie man an diepfeile's Beitrag sieht, auch schon an der kleinsten Anpassung scheitern, und hier jedes mal nachfragen müssen.
Wer lieber versucht, mit 100 Zeilen String-Funktionen die Power von regulären Ausdrücken nachzubilden, kann sich das auch antun.
Reguläre Ausdrücke beschreiben eine Familie von formalen Sprachen und gehören damit zur theoretischen Informatik. Diese Sprachen, die regulären Sprachen, befinden sich auf der untersten und somit ausdrucksschwächsten Stufe der Chomsky-Hierarchie (Typ 3). Sie werden erzeugt durch reguläre Grammatiken.
Ist aber nebensächlich, wie man das nennt.
Evtl. hilft das hier dem einen oder anderen schon weiter:
https://wiki.selfhtml.org/wiki/JavaScript/Objekte/RegExp
https://danielfett.de/de/tutorials/t…lare-ausdrucke/
http://www.regenechsen.de/phpwcms/index.php?regex_allg
Die UDF haben natürlich ihre Berechtigung, Mein Hinweis bezog sich aber darauf, daß RegEx ein unheimlich mächtiges Werkzeug sind, und daß es sich für jeden zu lernen lohnt , der nicht nur einmalig eine Lösung für ein Problem zusammenhacken will. diepfeile nützt die Sammlung so bisher wohl garnichts, weil er sie nicht mal copy&paste anwenden kann.
Zu den "/" am Anfang und Ende der Regex:
Zusätzlich zum eigentlichen reg. Ausdruck kann man dem Interpreter noch Optionen mitgeben, die die Interpretation des Ausdrucks beeinflussen, wie z.B. den Parameter s, der das Verhalten so ändert, daß nicht nur bis zum nächsten Zeilenumbruch gesucht wird, sondern über Zeilenumbrüche hinweg.
Der eigentliche Ausdruck wird deshalb in 2x (Anfang und Ende) das gleiche Zeichen eingeschlossen. Das muß garnicht immer ein "/" sein. Empfehlenswert ist es, ein Zeichen zu nehmen, das in dem Ausdruck sonst nicht vorkommt, z.B. "#".
Die Optionen in (? ) einzuschließen, ist AutoIt-Syntax. in PHP oder Javascript z.B. kommen die Optionen einfach hinter die, den Ausdruck umschließenden Zeichen.
EDIT BugFix: War vom Poster gelöscht worden. Wiederhergestellt.
Hier Beispiele zu sammeln, kann eine Hilfe sein für Leute, die regex'e verstehen.
Für alle anderen ist es, als würden sie ein paar Lautfolgen auswendig lernen für den Urlaub im Ausland, ohne auch nur die einzelnen Worte darin auseinanderhalten zu können, geschweige denn den Satzbau zu verstehen.
Regular Expressions ist eine Sprache, mit der man Suchmuster für Zeichenfolgen (Texte, Programmcode, Daten, etc.) definieren kann.
Hilfreich zum Erlernen sind Seiten wie https://regex101.com/ , um seine Ausdrücke auszuprobieren, und aufgrund der farbigen Markierungen der Teilausdrücke und der Fundstellen verstehen zu lernen, welcher Teilausdruck für die Erkennung welches Textes zuständig ist.
Neben der StringRegExp Seite in der Hilfedatei sind auch die Kommentare zu regex in der PHP-Hilfe online oft hilfreich.
Wer die Sprache nicht lernt, sondern nur fertige Ausdrücke kopiert, wird nie weiter kommen, genau wie "dumme" Maschinen, die auch immer nur das können, was ihnen jemand "beigebracht" hat. Regex'e sind aber ein SEHR mächtiges Werkzeug, mit dem man sich viel Arbeit sparen kann, nicht nur bezüglich der Länge des eigenen Programmcodes, sondern z.B. auch bei der automatisierten Verarbeitung riesiger Text/Datenmengen.
Das Sinnvollste wäre es wohl, die Erklärungen in der Hilfe hier zu diskutieren und entspr. Fragen von Laien ausführlicher zu erklären, incl. Beispielen.
EDIT BugFix: War vom Poster gelöscht worden. Wiederhergestellt.
Argh .. irgendwas ist doch immer :-O !
Ja, wieder zu schnell gewesen, ohne genau zu lesen. Hab mich nur gewundert, warum er nix mehr geschrieben hat. Peinlich ...
Aber was kurioses ist passiert: Vorgestern hat das Script am nächsten Morgen auf einmal nur noch 1.266 kb statt 1.888 gebraucht, dafür steht's nach Neustart heute bei 3.116kb.
Das versteh, wer will ...
Hab das Schreiben inzw. wieder direkt mit Dateinamen eingebaut, da das sowieso nur ca. 2x am Tag vorkommt.
Bei mir kommt die Anzeige des Scripts innerhalb des 3s Intervalls, nach dem die Windows Verbindungsanzeige die Trennung anzeigt, (Hab den Netzwerkadapter im Netzwerk- und Freigabecenter deaktiviert zum testen)
B.t.w. tatsächlich wird ein Int (32) zurückgegeben.
Argh! Stimmt, Du hast recht. Hab das Ding eigentlich nur schnell zusammenkopiert, weil ich mich über die ständigen Ausfälle von Vodafone geärgert hab.
Das wird dann allerdings auch nie aufgerufen und beim Beenden des Scripts sollten doch sowieso alle Referenzen gelöscht werden?
Muß ich also OnAutoItExitRegister benutzen. *DONE*
Das sollte aber alles keinen Einfluß auf den Speicherverbrauch während der Ausführung haben.
Gibts denn keine Möglichkeit, ein Programm zu überwachen, und im Betrieb zusätzlich requirierten Speicher zu erkennen? ES könnte ja schon reichen, sich den Inhalt anzusehen, um nen Hinweis auf den "Verursacher" zu finden.
FileFlush eingebaut, wobei der ganze Block ja ohnehin nur ca. 2x am Tag aufgerufen wird, wenn die Nachts an der Leitung schrauben.
DllClose und FileClose werden in Zeile 7 und 8 aufgerufen.
Sorry, ich hatte die DLL-Abfrage ursprüngl. in einer Funktion, da gehört jetzt ContinueLoop hin. *korrigiert*
Das ist das ganze Script, alle Variablen global, so daß nie neue angelegt werden, wie es bei Unachtsamkeit in einer Funktion passieren könnte.
Der Prozess belegt jetzt, 20 Std später, 3.376 Kb gegenüber 2.888 beim Start.
Folgendes kleines Tool soll die Ausfallzeiten meiner Internetverbindung loggen:
Global $status = 0, $IsCon, $icon[]=[-101, -99]
Global $hDLL = DllOpen("connect.dll")
TraySetIcon("netshell.dll", -101)
While 1
$IsCon = DllCall($hDLL, 'long', 'IsInternetConnected')
If @error Then ContinueLoop
If $status <> $IsCon[0] Then
TraySetIcon("netshell.dll", $icon[$IsCon[0]])
FileWriteLine("connection.log", @MDAY & "." & @MON & " " & @HOUR & ":" & @MIN & ":" & @SEC & (($IsCon[0]) ? " off":" on" & @CRLF))
$status = $IsCon[0]
EndIf
sleep(3000)
WEnd
Alles anzeigen
Um den Speicherverbrauch bei tagelanger Laufzeit zu reduzieren, habe ich schon alle Variablen global deklariert, so daß eigentlich nach dem Start kein weiterer Speicher mehr benötigt werden sollte. In der Praxis funktioniert das aber anscheinend doch nicht so, Zwar langsam, aber stetig belegt das Script immer mehr RAM.
Da ich keine Idee habe, woran das noch liegen könnte, hab ich im Task Manager mal ein Speicherabbild des laufenden Prozesses anlegen lassen. Der Prozess belegt laut TaskMan beim Start ~2.888 Kb, das Abbild ist aber schon 57Mb groß (oops?)
Im Netz finden sich nur Analysetips für die Crashdumps von Windows.
Womit/Wie kann man sich ansehen, welche Variable (oder Daten) da im RAM anscheinend nicht an die vorgesehenen Adressen (Variablen) geschrieben werden?
Und woran liegt es, daß das Script immer noch RAM frisst? Was hab ich da falsch gemacht?
ZitatUm ein Control genau 1px höher/links als das letzte zu positionieren (-1 ist ja reserviert für "gleicher Abstand von oben/links"), muß man es mit negativen Werten um ("Höhe/Breite des letzten Controls" + 1) nach oben/links verschieben/positionieren.
Mir ist erst jetzt aufgefallen, daß diese Aussage garnicht das Problem adressiert, das durch die besondere Bedeutung von "-1" entsteht. Das Problem ist nicht, ein Control 1px höher als das vorige zu plazieren, sondern 1px höher, als den Bezugspunkt (der bei GUICoordMode=2 ja die UNTERE/RECHTE Ecke des vorherigen Controls ist).
Ich verstehe die originale englische Erklärung dazu auch jetzt immer noch nicht: "But if you can use a multiple of the width you choose to skip or go back."
Was (zum Teufel!) kann ich (zumindest, wenn ich irgendein mysteriöses "Vielfaches der Breite [? von was?] nutzen" kann) "überspringen oder zurück gehen"? Und was soll ich machen, wenn ich nicht dieses mysteriöse "Vielfache der Breite [von was?]" nutzen kann?
Die einzige für mich nachvollziehbare Erklärung ist, daß man in den Fall, daß das nachfolgende Control genau 1px höher/links als die untere/rechte Ecker des Letzten plaziert werden soll, mittels GUISetCoord() den Bezugspunkt für die Ausrichtung neu bestimmen muß.
Entweder wir ändern die Erklärung "eigenmächtig" in der deutschen Hilfe so stark ab, oder wir fragen im engl. Forum die Devs nochmal nach einer verständlichen Erklärung (wobei ich da auch schon mit Verbesserungsvorschlägen zur Hilfe auf Mauern gestoßen bin, als ich deren inkonsistente Benutzung des Begriffs "Rückgabe" in einigen Hilfetexten moniert habe.)
Bemerkenswert finde ich auch, daß die verschiedenen "GUICoordMode"-Modi sich nur auf die Erzeugung der Gui auswirken, in der Folge beim Resizen aber auch mit "GUICoordMode=2" und mittels "-1" auf gleicher Höhe positionierte Controls ihre Positionierung zueinander nicht beibehalten.
Folgendes habe ich nun geändert:
- Den Bug bei ControlGetPos habe ich ergänzt (Bemerkung und Beispiel)
Ich würde das nicht mal als "Bug" bezeichnen, sondern ehr als "Eigenheit" o.ä.
Ich denke, daß das Absicht ist, daß Windows im Fullscreenmodus diese Daten nicht aktualisiert, weil die für Restore wieder benutzt werden. Man muß nur wissen, daß die Rückgabe von ControlGetPos im Fullscreenmodus "falsche" Werte liefert.
Ein Beispiel bastel ich in den nächsten Tagen.
Ich werd ab jetzt mal meine Füße still halten. Ich sollte so spät nix mehr posten, ich hab da PHP im Hinterkopf gehabt, wo Zeichen mit nem Backslash maskiert werden, statt mit ner Verdopplung.
Dann toi toi toi, ich wünsch Dir, daß das auch so bleibt. Allerdings, "wissen, daß bisher nichts schief gegangen ist" ist nicht das gleiche wie "wissen, warum aufgrund der Logik nichts schief gehen kann".
Obscurity bietet keine security.
Ich blende z.B. ab und zu größere Source-Bereiche mal mit #cs #ce aus, und reaktiviere die dann u.U. auch mal per ; vor den #cs #ce.
*mal advocatus diaboli spielen*
Stößt man auf ", muß man prüfen, ob davor (z.B. innerhalb eines RegEx) nicht noch \ steht. Und evtl. noch einer, der diesen wiederum maskiert. Oder der " innerhalb einer Zeichengruppe [\\"',.] eines Regex. U.s.w., es gäbe leider sehr viel, was da theoretisch schief gehen könnte.
Könnte man ja mal einen Kontest draus machen: Eine Gruppe entwirft solche Regeln, nach denen sich fehlerfrei z.B. Kommentare finden lassen sollen. Die andere schreibt einen (gültigen) Quelltext, bei dem diese Regeln versagen.