[QUIZ#1] Sven Mintel (JScript)

Sven Mintel

Mitglied
Puuh, das Finden ging ja recht fix, nur das Markieren hatte es in sich, ich bin schon gespannt, wie die anderen Quizzer das gelöst haben :)

Hier erstmal mein Resultat, Erläuterungen gibt es im Anschluss:
Javascript:
strOut = 'fehlerhafte Parameterzahl';

if(WScript.arguments.length==1)
  { strArg            = WScript.arguments.Item(0);
    arrChars          = strArg.split('');
    strSearchPattern  = '^.*('+arrChars.join(').*(')+').*$';
    strReplacePattern = '('+arrChars.join(')(.*)(')+')';
    i=1;
    strReplacement =  eval('"'+strArg.replace(/./g, '<$"+(i++)+">')
                                     .replace(/\(\)/g, ')("$"+(i++))(')
                                     .replace(/></g, '>$"+(i++)+"<')+'"');
    
    
    objFso    = new ActiveXObject("Scripting.FileSystemObject");
    objStream = objFso.OpenTextFile("presidents.txt",1, true);
   
    strDb     = objStream.ReadAll();
    objStream.close();
   
    if(strDb = strDb.match(new RegExp(strSearchPattern,'mig')))
      {
        strOut = strDb.join('\n')
                    .replace(new RegExp(strReplacePattern,'ig'),strReplacement)
                    .replace(/></g,'');
      }
    else
      {
        strOut = 'Kein Treffer';
      }
  }
WScript.echo(strOut);

Gesucht und "markiert" wird natürlich per RegExp.
In den Erläuterungen gehe ich mal von einer Suche nach abc aus.

Schritt für Schritt:
  • Zeile 5: Ich erstelle aus den einzelnen Zeichen des Suchparameter einen Array.
  • Zeile 6: Das Suchmuster, mit welchem ich die zutreffenden Datensätze ermittle. Der Ausdruck, welchen ich durch joinen des zuvor erzeugten Arrays erhalte, sieht so aus:
Code:
^.*(a).*(b).*(c).*$
Ich werde die Präsidentenliste später am Stück einlesen, da ich sie eh komplett benötige, der Ausdruck wird daher mit multiline-Flag angewendet werden.

Was das Finden betrifft, war es das eigentlich schon :)

  • Zeile 7:
    Zum Ersetzen(Markieren) benötige ich einen anderen Ausdruck, mit dem ich Referenzen auf die Fundstellen im Präsidentennamen und die Zeichen dazwischen erzeuge, ich erstelle das Suchmuster wieder durch joinen des Arrays:
Code:
(a)(.*)(b)(.*)(c)


  • Zeile 9:
    Diese Wurst erzeugt mir den String, mit dem ich die Fundstellen später ersetze(markiere), ich benötige dafür Folgendes:
Code:
<$1>$2<$3>$4<$5>
Der erzeugte String sieht vorerst folgendermaßen aus:
Code:
<i++>i++<i++>i++<i++>
Er wird per eval() ausgewertet, dabei wird der in Zeile 8 erstellte Zähler inkrementiert und ich erhalte das gewünschte Ergebnis.
Auf die Verwendung einer Schleife wollte ich hier lieber verzichten.


  • Zeile 15-19:
    Präsidentenliste einlesen
  • Zeile 21-25
    Suchen und Ersetzen(markieren) mithilfe der zuvor beschriebenen Ausdrücke.
    Ich entferne dort am Ende noch zur Kosmetik alle Vorkommen von ><(Falls einzelne Fundstellen von Zeichen direkt aufeinander folgen)
  • Zeile 31:
    Ausgabe und fertig :)
Code:
J<a>mes <B>u<c>hanan
<Ab>raham Lin<c>oln
 

OnlyFoo

Erfahrenes Mitglied
'><' gegen '' ersetzten kann zu Problemen führen, wenn der Suchbegriff bereits '><' hatte. Aber die Idee mit dem eval() find ich ganz niedlich, wenn ich auch ne Schleife an dieser Stelle für perfomanter gehalten hätte :)
 

Mark

Cinema4D
Hi Sven,

ja, Deine Markierungs-Variante finde ich auch total Klasse! :) ...auf die "Idee" dahinter bin ich ja noch gekommen, aber sie umzusetzen vermochte ich nicht ;)
Schöne Lösung! :)

Liebe Grüße,
Mark.
 

Neue Beiträge