Regex - Lizensfreies Include für reguläre Ausdrücke (Beta)

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag 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. :allright:
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag 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.
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag von MenschMarkus »

Ah jetzt ja, ...

Das bringt etwas Licht ins Dunkle.
Könnte ich mit RegEx den Mayr auch noch irgendwie erfassen?
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag von NicTheQuick »

Vermutlich mit

Code: Alles auswählen

CreateRegex(#Regex, "[Mm][aeä][ijy][aeä]{0,1}r")
oder einfacher

Code: Alles auswählen

CreateRegex(#Regex, "[Mm][aeä][ijy][aeä]?r")
Ungetestet!

Edit:
Getestet! :mrgreen:
Bild
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag 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" ?
Wissen schadet nur dem, der es nicht hat !
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag 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...)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: Regex - Lizensfreies Include für reguläre Ausdrücke (Bet

Beitrag von matbal »

Das ging ja fix... Vielen Dank

:allright:
Antworten