Ich meine nur schon eine "Quick Reference" schlägt einen ja tot. Und man möchte es irgendwie auch gar nicht lernen...

Ein Lösung ist (Aus dem Web kopiert).
Der mittlere Bereich ist einigermassen einleuchtend, aber wie "denkt" man das als gesuchten "Match" / Einheit?([^"']*jquery[\-\d.]*\.min\.js[^"']*)
Ich hab jetzt mal ein bisschen danach gesucht, habe aber die dahintersteckenden Algorithmen noch nicht richtig verstanden. Ein Stichwort ist wohl der Thompson Algorithmus. Wenn jemand mit einfachen Worten beschreiben kann, was der 'Trick' dahinter ist, gerne!Warf hat geschrieben: Do 5. Jan 2023, 23:48 Es gibt den unterschied zwischen dem Matchen und dem Finden, beim Matchen (die Frage ob ein string in gänze eine bestimmte form hat) braucht man kein backtracking, da ist die Laufzeit O(n). Beim suchen wo das pattern irgendwo auftauchen kann muss man backtracken und braucht O(n*m) [...]
DIe Runde Klammer ist vermutlich weil mache Regex implementationen dir nur das matching ergebnis ausgeben wenn es ne gruppe gibt, aber ist sonst theoretisch unnötig (für TRegExpr soweit ich weis z.b. nicht benötigt). Und genau das [^"'] bedeitet weder " noch ' beliebig oft. Vermutlich um nicht zufällige string erwähnungen zu matchen.theo hat geschrieben: Fr 6. Jan 2023, 12:10Der mittlere Bereich ist einigermassen einleuchtend, aber wie "denkt" man das als gesuchten "Match" / Einheit?([^"']*jquery[\-\d.]*\.min\.js[^"']*)
Wozu dient die Runde Klammer hier?
Warum suche ich nach "kein Hochkomma" oder bedeutet das ^ hier etwas anderes?
Vielleicht ist mein Problem, dass ich das eher schrittweise denke und nicht als gesamten Ausdruck.
Das ist im grunde automaten theorie. Beginnen wir mal ganz einfach ein DFA (Deterministic Finite Automata, DEA in deutsch) ist ein Automat der verschiedene states hat und mit eingaben zwischen den states wechseln kann. Kann man als graphen darstellen.kupferstecher hat geschrieben: Fr 6. Jan 2023, 12:24 Ich hab jetzt mal ein bisschen danach gesucht, habe aber die dahintersteckenden Algorithmen noch nicht richtig verstanden. Ein Stichwort ist wohl der Thompson Algorithmus. Wenn jemand mit einfachen Worten beschreiben kann, was der 'Trick' dahinter ist, gerne!
Code: Alles auswählen
regex := OrExpr(ConcatExpr([LiteralExpr('a'), KleeneExpr(LiteralExpr('b)')]), ConcatExpr([KleeneExpr(LiteralExpr('c')), LiteralExpr('d')])
for c in input do
regex.step(c);
if Regex.Endstate then
WriteLn('Match');
Code: Alles auswählen
// Special Keys (Arrows, F-Keys, Insert, Delete, whatever)
manager.AddAutomaton(TEnclosedSequenceAutomaton.Create(csi,
['A'..'D', 'H', 'F', 'P'..'S', '~'], Ord(stCSI)));
// F1-F4
manager.AddAutomaton(TSingleLetterSequenceAutomaton.Create(ss3,
['P'..'S'], Ord(stSS3)));
// Alt + key
manager.AddAutomaton(TPrefixAutomaton.Create(#27, TUTF8CharAutomaton.Create(0),
Ord(stModifiedChar)));
// Char keys and Ctrl Keys
manager.AddAutomaton(TUTF8CharAutomaton.Create(Ord(stChar)));
Code: Alles auswählen
procedure TUTF8CharAutomaton.DoStep(c: char);
begin
if FSink then
Exit;
if Count = 1 then
begin
if Ord(c) and 128 = 0 then
MakeFinal
else if Ord(c) and $E0 = $C0 then
FExpectedLength := 2
else if Ord(c) and $F0 = $E0 then
FExpectedLength := 3
else if Ord(c) and $F8 = $F0 then
FExpectedLength := 4
else
FSink := True;
end
else if (Count > FExpectedLength) or (ord(c) and $C0 <> 128) then
FSink := True
else if Count = FExpectedLength then
MakeFinal;
end;
Nicht ganz. Das [^"'] wird offenbar benötigt, um den "Match-Bereich" auszudehnen auf die gesamte URL.Warf hat geschrieben: Fr 6. Jan 2023, 13:44DIe Runde Klammer ist vermutlich weil mache Regex implementationen dir nur das matching ergebnis ausgeben wenn es ne gruppe gibt, aber ist sonst theoretisch unnötig (für TRegExpr soweit ich weis z.b. nicht benötigt). Und genau das [^"'] bedeitet weder " noch ' beliebig oft. Vermutlich um nicht zufällige string erwähnungen zu matchen.theo hat geschrieben: Fr 6. Jan 2023, 12:10Der mittlere Bereich ist einigermassen einleuchtend, aber wie "denkt" man das als gesuchten "Match" / Einheit?([^"']*jquery[\-\d.]*\.min\.js[^"']*)
Wozu dient die Runde Klammer hier?
Warum suche ich nach "kein Hochkomma" oder bedeutet das ^ hier etwas anderes?
Vielleicht ist mein Problem, dass ich das eher schrittweise denke und nicht als gesamten Ausdruck.
Code: Alles auswählen
(["'].*jquery[\-\d.]*\.min\.js.*["'])
Code: Alles auswählen
([A-Za-z0-9+.-]+:)?\/\/[A-Za-z0-9_~-]+(\.[A-Za-z0-9_~-]+)*(:\d+)?(\/[A-Za-z0-9_~-]+)*\/jquery[\-\d.]*\.min\.js(\?[A-Za-z0-9_~%.-]+=[A-Za-z0-9_~%.-]+(&[A-Za-z0-9_~%.-]+)*)?(#[A-Za-z0-9_~%.-]+)?
Code: Alles auswählen
const
DomainCharset = '[A-Za-z0-9_~-]';
PathCharset = '[A-Za-z0-9_~%.-]';
SchemeExpr = '([A-Za-z][A-Za-z0-9+.-]*:)?\/\/';
HostExpr = DomainCharset + '+(\.' + DomainCharset + '+)*';
PortExpr = '(:\d+)?';
PathExpr = '(\/' + DomainCharset + '+)*';
JQueryFileExpr = 'jquery[\-\d.]*\.min\.js';
QueryExpr = '(\?' + PathCharset + '+=' + PathCharset +'+(&' + PathCharset + '+)*)?';
FragmentExpr = '(#' + PathCharset + '+)?';
JQueryURLExpr = SchemeExpr + HostExpr + PortExpr + PathExpr + '\/' + JQueryFileExpr + QueryExpr + FragmentExpr;
Code: Alles auswählen
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
Code: Alles auswählen
HostExpr = DomainCharset * OneOrMore + ('.' + DomainCharset * OneOrMore) * ZeroOrMore;
[sarkasmus on]Ich glaube, das ist eines der wenigen Gebiete wo KI scheitern könnte[sarkasmus off]theo hat geschrieben: Fr 6. Jan 2023, 16:35 Das Generieren des Ausdrucks könnte auch ein Anwendungsfall für die KI sein!![]()
Warf, vielen Dank!
Das ist der Komplizierteste Teil an dem ganzen system, die Umwandlung von NFA zu DFA, denn ein DFA hat per definition in jedem input nur einen weg den er laufen kann, während der NFA mehrere haben kann. Das funktioniert durch die Potenzmengenkonstruktion, im grunde bläht man dabei den Automaten massiv auf, sodass es praktisch für jeden mögliche kombination an wegen zu einem zustand ein neuer State erzeugt (sehr übersimplifiziert). Damit wird der DFA ziemlich groß, aber wie gesagt dafür kenn er danach nochmal reduziert werdenkupferstecher hat geschrieben: Fr 6. Jan 2023, 18:39 Die Idee mit dem Automaten ist mir jetzt klar, das Backtracking auch. Wo es noch klemmt, ist, wie man das Backtracking bei mehreren Pfaden vermeidet. Aber das ist schon mal eine gute Motivation das Thema weiter zu verfolgen~
Code: Alles auswählen
// Achtung, Wert xy kann hin und wieder einen Zusatzstring enthalten
Genau so sehe ich das auch und bisher konnte mich niemand umstimmen.Joh hat geschrieben: Sa 7. Jan 2023, 11:21 dann verstehe ich auch nach 2 Jahren, warum diese komische if-Bedingung oder Schleife in Zeile 18 steht
Bei regex verstehe ich schon am nächsten Tag nicht mehr, was ich da tat.
Yes Sir!theo hat geschrieben: Sa 7. Jan 2023, 17:35Genau so sehe ich das auch und bisher konnte mich niemand umstimmen.Joh hat geschrieben: Sa 7. Jan 2023, 11:21 dann verstehe ich auch nach 2 Jahren, warum diese komische if-Bedingung oder Schleife in Zeile 18 steht
Bei regex verstehe ich schon am nächsten Tag nicht mehr, was ich da tat.
Regex innerhalb von Pascal ist ein bisschen wie Assembler innerhalb von Pascal.
Es mag Fälle geben, wo man damit einen Code-Abschnitt optimieren kann, aber dafür muss es sehr, sehr gute Gründe geben.
Im Normalfall sollte man Kryptisches umschiffen.