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

Moderator: MVogt

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

Beitragvon Theo_Gottwald » 12. Feb 2017, 13: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: Alles auswählen
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: Alles auswählen
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: Alles auswählen
' 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: Alles auswählen
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: Alles auswählen
&NOT:{text1&AND:text2}


funktioniert so nicht, allerdings kann man die aufgelöste Variante verwenden:

Code: Alles auswählen
{&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: Alles auswählen
{{{Text1&ORText2}&ANDTHEN:{Text1&ORText4}}&ANDTHEN:Text2}

Neu hinzugekommen ist der fortschrittliche "Tippfehler-Operator"; Beispiel:

Code: Alles auswählen
{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: Alles auswählen
{text1&TOLERANT:89}

{text1&TOLERANT:&DOCAPS:89}


Achtung: Folgendes funktioniert nicht (und macht auch keinen Sinn)
Code: Alles auswählen
{{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.
Benutzeravatar
Theo_Gottwald
 
Beiträge: 248
Registriert: 03. Okt 2009, 08:57
Wohnort: Herrenstr.11 * 76706 Dettenheim

Zurück zu Package Robot

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron