Mit Regular Expression Callout alle Funde bearbeiten und ersetzen

Hilfreiche Erklärungen und Tipps zum Lernen von Autohotkey

Moderator: jNizM

User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Mit Regular Expression Callout alle Funde bearbeiten und ersetzen

10 Dec 2016, 10:52

Ich habe hier ausprobiert ob sich Regexpression Callouts dazu eignen, Muster global zu ändern.
Nicht einfach zu ersetzen sondern dabei zu bearbeiten.
zB wird so aus

flei\u00dfige Mittzwanziger f\u00fcllt ..\u2011 \u2019 Jonas Kaufmann \u2013 Dolce Vita
fleißige Mittzwanziger füllt ..- ’ Jonas Kaufmann – Dolce Vita



Fazit: Im Prinzip geht es ganz gut.
Beachten muss man, das das Callout nur bei einem Match aufgerufen wird.
Die Ergebnisvariable sollte daher immer schonmal mit dem Haystack vorbelegt sein,
und das Callout Ergebnis nur übergeben werden wenn es nicht leer ist

außerdem muss man mit der Bennenung der Funktionen aufpassen und gleichermaßen bei der Übergabe der Variablen.

Code: Select all

RegExMatch(text, "im).\\u(.{4})(?CCallout1)") ;html-entities werden in unicode umgewandelt
if  CalloutReWorkAll1()<>""
 test :=   CalloutReWorkAll1() "`n"
else 
 test:= text ; sonstwäre test leer wodurch im nächsten regexp der Haystack leer wäre
 ; callout werden NUR bei einem Match aufgerufen!!

;Das Ergebnis vom ersten Callout hird her als Haystack benutzt
;wird kein Kaufmann gefunden wird der Callout nicht aufgerufen und test daher auch nicht geändert.
RegExMatch(test, "im)(Kau.mann)(?CCallout2)") ;Kaufmann wird gelöscht
if  CalloutReWorkAll2()<>""
 test :=   CalloutReWorkAll2()

 msgbox , %  test ;fleißige Mittzwanziger füllt ..- ’ Jonas – Dolce Vita
exitapp
return




;============================================================
Callout1( m,CalloutNumber, FoundPos, text, NeedleRegEx){
;msgbox, wird nur aufgerufen wenn es einen Match gibt
    CalloutReWorkAll1(m1,text)
    return 1
} 

CalloutReWorkAll1(match:="", haystack:=""){
static  g , hh , i:=0

;innerhalb von callout haystack merken.
if (haystack<>"") and !i
  hh:=haystack , i:=1
  
  y:=chr(Format("{:d}" ,"0x" match)) ;match bearbeiten
  hh := StrReplace(hh, "\u" match , y) ;match ersetzen

if (haystack="") ;ausserhalb des callouts leer aufrufen CalloutReplaceAll()
return hh , i:=0
return
}

;============================================================
Callout2( m,CalloutNumber, FoundPos, test, NeedleRegEx){
    CalloutReWorkAll2(m1,test)
    return 1
} 

CalloutReWorkAll2(match:="", haystack:=""){
static  g , hh , i:=0
;innerhalb von callout haystack merken.
if (haystack<>"") and !i
  hh:=haystack , i:=1
  
  y:=""
  hh := StrReplace(hh,match , y) ;match ersetzen (löschen)

if (haystack="") ;ausserhalb des callouts leer aufrufen CalloutReplaceAll()
return hh , i:=0
return
}
Last edited by haichen on 16 Dec 2016, 04:21, edited 3 times in total.
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mit Regular Expression Callout alle Funde bearbeiten und ersetzen

10 Dec 2016, 12:40

Moin,

das ist interessant. Ich habe das vor einiger Zeit nur einmal probiert und dann wieder aufgegeben, weil es mir zu 'unübersichtlich' war.

Ein Problem sehe ich in Deinem Beispiel. Die statische Variable i in CalloutReWorkAll() wird nie wieder zurückgesetzt, wenn ihr mal der Wert 1 zugewiesen wurde. Damit laufen weitere Aufrufe eines RegEx mit diesen Callout-Funktionen eher nicht wie gewünscht.

Und noch etwas: Das ist ja eher kein Skript bzw. keine Funktion, das/die von anderen Nutzern ohne Anpassungen übernommen werden kann. Es ist für mich mehr ein Beispiel, wie man es machen kann. Ich würde es deshalb gern nach 'Tutorials' verschieben, auch wenn es ein sehr knappes ist (vielleicht sollte man die Überschrift um 'Tipps & Tricks' ergänzen, dann würde es besser passen).

Grüße,
just me
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Mit Regular Expression Callout alle Funde bearbeiten und ersetzen

10 Dec 2016, 14:01

Klar, kannst du gerne verschieben. Ich hab
return hh
zu
return hh , i:=0
geändert. Dann wird i immer zurückgesetzt wenn man die Funktion außerhalb des Callouts aufgerufen wurde.
Wäre schön wenn man diese callout funktion tatsächlich komplett als Funktion zum ändern des haystacks nutzen könnte. Aber Funktion in Funktion geht ja nicht.
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Mit Regular Expression Callout alle Funde bearbeiten und ersetzen

16 Dec 2016, 04:18

Ich habe das Beispiel auf zwei hintereinander folgende Callouts erweitert, und noch ein wenig dazu geschrieben.

Return to “Tutorials”

Who is online

Users browsing this forum: No registered users and 17 guests