Easter-Egg Befehle im MPR Part III - Wildcard / Fuzzy Logic

Moderator: MVogt

Post Reply
User avatar
Theo_Gottwald
Posts: 367
Joined: 03. Oct 2009, 08:57
Location: Herrenstr.11 * 76706 Dettenheim
Contact:

Easter-Egg Befehle im MPR Part III - Wildcard / Fuzzy Logic

Post by Theo_Gottwald » 12. Feb 2017, 12:17

Letzte Woche habe ich mal alte Entwickler-Unterlagen nachgesehen von vor etlichen Jahren.
Und tatsächlich es gibt Befehle, die der MPR kann und die gar nicht in der Hilfe stehen.
Undokumentierte "Geheimbefehle".

Thema in Part III: Wildcard- und Fuzzy-Logic.

****************************
s_fuzzy_compare
****************************

Diese Funktion vergleicht zwei Zeichenketten. Dabei wird ein gradueller Vergleich angewendet, der entweder:
- eine Übereinstimmung von 0% bis 100% zurückliefert (als Zahl 0 bis 100)
- oder (wenn Parameter 3 = "mistakes") die Anzahl der Tippfehler (Mistakes) zwischen den beiden Strings zurückgibt.

Beispiele:

Code: Select all

VAR\$$TXA=MyCommands
VAR\$$TXB=MyCummands
GRN\s_fuzzy_compare|$$TXA|$$TXB|mistakes>$$RES
' $$RES ist nun 1, da sich der Schreiber einmal vertippt hat.

GRN\s_fuzzy_compare|$$TXA|$$TXB>$$RES
' $$RES ist nun 90, da die Übereinstimmung zwischen den beiden Strings 90% beträgt.
****************************
s_wildcard_compare
****************************

Texte einfach nach dem Schema "A = B ?" zu vergleichen, erfordert nicht besonders viel Intelligenz.
Oftmals will man wissen, ob Dinge ähnlich sind, oder bestimmte Bestandteile enthalten sind.
Dazu können Wildcards herangezogen werden.

Die Vergleichsfunktion s_wildcard_compare vergleicht einen Wildcard-String (Parameter 1) mit einem zweiten String (Parameter 2).
Das Ergebnis ist 1 (das bedeutet Übereinstimmung) oder 0 (die Strings stimmen nicht überein).

Es gibt drei verschiedene Wildcard-Sets.

Set 1:
------

Als Wildcards werden in diesem Fall primär die zwei Joker-Zeichen aus DOS-Zeiten verwendet.
* - ersetzt beliebige Zeichen
? - ersetzt ein Zeichen

Beispiel:

Code: Select all

VAR\$$TXA="Jan?a*"
VAR\$$TXB="Januar" 
GRN\s_wildcard_compare|$$TXA|$$TXB>$$RES

' Man kann in allen Fällen JIZ\ (Jump-If-Zero) verwenden, um das Resultat auszuwerten.
JIZ\$$RES:Label
' $$RES wäre hier 1, da der Vergleich erfolgreich ist. Andernfalls ist das Ergebnis 0.
Set 2:
------

Falls der Zusatz "numeric" (Parameter 3) angegeben wird, dann wird zusätzlich das Zeichen
# - ersetzt eine Ziffer
ausgewertet.

Code: Select all

' der Zusatz "numeric" bewirkt, dass auch das # Zeichen ausgewertet wird.
GRN\s_wildcard_compare|$$TXA|$$TXB|numeric>$$RES
JIZ\$$RES:Label
Set 3:
------

' der Zusatz "all" bewirkt, dass die AGR\-Stringpatterns verwendet werden. Diese sind unten aufgeführt.
Beispiel:

Code: Select all

VAR\$$TXA="{Janner&TOLERANT:&DOCAPS:60}"
GRN\s_wildcard_compare|$$TXA|$$TXB|all>$$RES
JIZ\$$RES:Label

Pattern   	Abkürzung	Beispiel
{&DOCAPS:}	{&0:}		{&DOCAPS:ExPE} 		-> Groß-/Kleinschreibung beachten.
{&OR:}      	{&1:}		{Text1&OR:Text2} 		-> A oder B oder beides
{&XOR:}	{&2:}		{Text1&XOR:Text2} 		-> A oder B
{&AND:}	{&3:}		{Text1&AND:Text2} 		-> A und B; Reihenfolge beliebig
{&ANDTHEN:} 	{&4:}		{Text1&ANDTHEN:Text2}	-> A dann B
{&FUZZY:}	{&5:}		{{Text1}&FUZZY:[value]}	-> ungefähr A
{&TOLERANT:}	{&6:}		{{Text1}&TOLERANT:[value]} 	-> A zu min. X% 
{&NOT:} 	{&7:}		{&NOT:{Text1}} 		-> darf nicht vorkommen
{&EXACT:}	{&8:}		{&EXACT:Text1} 		-> genau A (Ohne Groß/Klein)
{&NOTEXT:}	{&9:}		{&9:} 

{&t:}     							-> Always True
{&f:}     							-> Always False

Alle Pattern können auch mit der Abkürzung verwendet werden, also statt &EXACT: kann man einfach &0: schreiben.
Die einfachen Operatoren (&OR, &XOR, &AND, &ANDTHEN) können beliebig oft wiederholt werden, also
{Text1&OR:Text2&OR:Text3&OR:Text4&OR:Text5... usw.}
ist möglich.

Der &NOT: Operator bezieht sich auf das Nichtvorhandensein von Text; er dient nicht dazu, Pattern-Berechnungen zu negieren. Also

Code: Select all

&NOT:{text1&AND:text2}
funktioniert so nicht, allerdings kann man die aufgelöste Variante verwenden:

Code: Select all

{&NOT:text1}&AND:{&NOT:text2}&AND:{&NOT:text3}
... etc.

Dies funktioniert mit allen einfachen Operatoren.

Es gibt keine Beschränkung auf 2 Operatoren wie ansonsten bei den WinRobots-Suchmustern, also beispielsweise AFO\(?), STW\ etc. Dadurch sind beliebig viele Internationalisierungen im gleichen Script denkbar.

Das {&EXACT:Text1}-Pattern ersetzt das WinRobots Standard-Suchmuster "Text1&&" (&& am Ende).

Prinzipiell sind auch Verschachtelungen möglich, solange die Klammern korrekt gesetzt werden, also zum Beispiel:

Code: Select all

{{{Text1&ORText2}&ANDTHEN:{Text1&ORText4}}&ANDTHEN:Text2}
Neu hinzugekommen ist der fortschrittliche "Tippfehler-Operator"; Beispiel:

Code: Select all

{Text1&FUZZY:5} 
Die Zahl hinter dem "&FUZZY:" gibt an, wie oft man sich vertippen darf, so dass der Text trotzdem erkannt wird.

Ebenso neu hinzugekommen ist der "&TOLERANT" Operator. Hierbei wird eine %-Zahl angegeben, die die Wortähnlichkeit angibt, ab der der Text der Bedingung entspricht.

Beispiel:

Code: Select all

{text1&TOLERANT:89}

{text1&TOLERANT:&DOCAPS:89}
Achtung: Folgendes funktioniert nicht (und macht auch keinen Sinn)

Code: Select all

{{text1&OR:text2}&TOLERANT:&DOCAPS:89}
da der "&TOLERANT" Operator nur Texte auswerten kann.

Bei allen Operatoren kann jeweils das "&DOCAPS:" verwendet werden. Dadurch wird die jeweilige Klammerebene auf Groß-/Klein-Schrift umgeschaltet, berücksichtigt dann also Groß- und Kleinschreibung.

Aber noch Mal der Hinweis: Die Befehls stehe nicht in der Hilfe und sind derzeit offiziell nicht vorhanden obwohl sie jeder MPR Nutzer sofort nutzen kann. Also dazu ist kein Update nötig die Befehle sind da schon drin und zwar seit Jahren.

Post Reply

Return to “Package Robot”

Who is online

Users browsing this forum: No registered users and 2 guests