Seite 2 von 2
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 03.05.2013 21:42
von MenschMarkus
Ich habe gerade erst angefangen mich mit Regular Expression zu beschäftigen. Meine Kenntnisse darüber sind eher rudimentär.
Zum Testen habe ich mir versucht ein einfaches Beispiel auszudenken. Ich suche den Namen Meier, weiß aber nicht genau wie er geschrieben wird. Ich kam auf folgenden einfachsten "Versuchsaufbau"
Code: Alles auswählen
CreateRegularExpression(0,"[Mm][aeä][ijy][aeä]r")
Debug MatchRegularExpression(0,"Maier")
Debug MatchRegularExpression(0,"Meier")
Debug MatchRegularExpression(0,"Majer")
Debug MatchRegularExpression(0,"Mejer")
Debug MatchRegularExpression(0,"Mayer")
Debug MatchRegularExpression(0,"Mayr")
Ergebnis erwartungsgemäß
1, 1, 1, 1, 1, 0
Leider konnte ich Mayr nicht finden da hier die Anzahl der Buchstaben nicht übereinstimmt
Jetzt der Versuch mit STARGATE's Code
Code: Alles auswählen
CreateRegex(#Regex, "[Mm][aeä][ijy][aeä]r")
Debug ReplaceRegex(#Regex, "Maier Meier Majer Mejer Mayer Mayr",@Callback())
Ergebnis überraschenderweise "Mayr"
Ich schätze einmal der Regex Code ist hier abzuändern, doch das muss ich erst noch lernen.
Ich find die Idee super, da ich nicht nur angezeigt bekomme ob es eine übereinstimmung gibt oder nicht, sondern jeden Treffer auch genannt bekomme.

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 03.05.2013 21:51
von STARGÅTE
Ich weiß nicht, was in deinem Callback passiert, aber da du ReplaceRegex() benutzt, werden alle Treffer mit dem ersetzt, was der Callback zurück gibt.
Da "Mayr" kein Treffer ist, bleibt es unverändert im String, welcher ja am Ende zurückgegeben wird.
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 03.05.2013 22:12
von MenschMarkus
Hier die Callback Procedure
Code: Alles auswählen
Procedure.s Callback(Map Hit.s())
If Hit("Maier")
Debug "Treffer: Maier: "+Hit()
ProcedureReturn "<b>"+Hit()+"</b>"
ElseIf Hit("Meier")
Debug "Treffer: Meier: "+Hit()
ProcedureReturn "<i>"+Hit()+"</i>"
ElseIf Hit("Mayer")
Debug "Treffer: Mayer: " +Hit()
ProcedureReturn "<i>"+Hit()+"</i>"
ElseIf Hit("Meyer")
Debug "Treffer: Meyer: " +Hit()
ProcedureReturn "<i>"+Hit()+"</i>"
ElseIf Hit("Mayr")
Debug "Treffer: Mayr: " +Hit()
ProcedureReturn "<i>"+Hit()+"</i>"
EndIf
EndProcedure
CreateRegex(#Regex, "[MmNn][aeä][ijy][aeä]r")
Debug ReplaceRegex(#Regex, "Maier Meier Mayer Meyer Mayr",@Callback())
;Debug ExtractRegex(#Regex, "Maier Meier Mayer Meyer Mayr",@Callback())
Bei ExtractRegex() erhalte ich als Ergebnis 0
Ich muß allerdings gestehen die pbi habe ich mir noch nicht komplett angesehen und verstanden.
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 03.05.2013 22:18
von STARGÅTE
Den Callback benutzt du falsch.
Die Map Hit.s() enthält immer nur einen Treffer, die Elemente in der Map, sind nur "Untergruppen" fallst du eine Gruppe im Regulären Ausdruck erstellt hast.
Code: Alles auswählen
Procedure.s Callback(Map Hit.s())
Debug Hit()
EndProcedure
Würde dir also bei einem ExtractRegex() schon alle Treffer im Debugger ausstücken, ExtractRegex() hat selbst kein Rückgabewert.
Code: Alles auswählen
Procedure.s Callback(Map Hit.s())
ProcedureReturn "<i>"+Hit()+"</i>"
EndProcedure
Würde hingegen bei einem ReplaceRegex() alle Treffer mit einem <i> </i> Tag umschließen und dann den Gesamtstring zurückgeben.
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 03.05.2013 22:37
von MenschMarkus
Ah jetzt ja, ...
Das bringt etwas Licht ins Dunkle.
Könnte ich mit RegEx den Mayr auch noch irgendwie erfassen?
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 03.05.2013 22:53
von NicTheQuick
Vermutlich mit
oder einfacher
Ungetestet!
Edit:
Getestet!

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 07.05.2013 17:08
von MenschMarkus
Danke Nic, das hat funktioniert.
Mittlerweile konnte ich mich etwas intensiver mit RegEx beschäftigen. Ich kann sogar nach Vor und Nachnamen suchen, das da wäre:
Code: Alles auswählen
CreateRegex(#Regex, "[Mm][aeä][ijy][aeä]?r|[eE][Mm][ijl]l")
; findet "Emil Maier" oder "Maier Emil"
Die Pipe "|" ist hierfür vorgesehen und steht im Prinzip für ein logisches ODER.
Was ich nicht gefunden habe wäre das Pendant für ein logisches UND welches aber nicht auf die Reihenfolge der Worte achtet, sonst könnte man die Pipe ja einfach weg lassen.
Sollte es ein solches Zeichen nicht geben funktioniert auch ein
Code: Alles auswählen
CreateRegularExpression(0,"\b[Mm][aeä][ijy][aeä]?r\b")
CreateRegularExpression(1,"\b[eE][Mm][ijl]l\b")
If MatchRegularExpression(0,"Maier") And MatchRegularExpression(1,"Emil")
Debug "Treffer"
Else
Debug "KeinTreffer"
EndIf
Wenn aus Emil eine Emilie wird gibts kein Treffer mehr!
Das ist aber nicht so elegant, da es etwas mehr code verwendet.
Kennt jemand das RegEx "UND" ?
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 24.09.2013 10:10
von matbal
@STARGÅTE
Deine schöne und einfach anwendbare Include funktioniert unter PB5.20 leider nicht mehr.
Ich bekommen folgende Fehlermeldung:
---------------------------
PureBasic
---------------------------
Zeile 115: Struktur mit dynamischen Elementen ist in StructureUnion nicht erlaubt.
---------------------------
OK
---------------------------
Ich wäre dankbar, wenn du eine Lösung finden könntest. (Ich habe leider kein Durchblick...)
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 24.09.2013 10:31
von STARGÅTE
Jup habe ich bereits angepasst.
Neue Version findest du im ersten Post.
Zusätzlich sind nun auch gefräßige und genügsamme Quantitäten möglich und lookahead.
Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet
Verfasst: 24.09.2013 12:29
von matbal
Das ging ja fix... Vielen Dank
