Biesterfeld: RegExp

Hej Leute,

sitz schon den ganzen Tag vorm Rechner (privater Adventskalender muss fertig werden ;) ) und bei mir raucht  schon alles, dass ich glaub grad nen kleinen Knoten zu haben.

Also ich möchte den aus einem input-Feld übermittelten String auf das Vorhanden sein nach Textbausteinen prüfen. Idee ist, wenn ich z.B. "Schatten" hören möchte aber jemand "der Schatten" eingibt, isses trotzdem richtig. Folgende Funktion:

var answer;
   var str = document.eingabe.loesung.value;
   switch(type){
      case 6:    answer = "echo"; break;
      case 12:   answer = "schatten"; break;
   }
   if(str.search(/answer/i) != -1){
      ...
   }

Das Problem ist nun dass ich in Selfhtml nüscht gefunden habe, dass ich einen String mit dem _Variableninhalt_ abgleichen kann. In Perl ist das ja bekanntermaßen kein Problem. Auch der Versuch den gesamten Ausdruck in die Variable zu pressen ist fehlgeschlagen, also:

answer = "/schatten/i";
   str.search(answer)

Naja, bin mir sicher, es ist ne Kleinigkeit die ich übersehen habe und bin für jede Hilfe dankbar.

viele Grüße
Biesterfeld

  1. Hallo Biesterfeld,

    Da kommst Du ganz ohne regulaeren Ausdruck aus, naemlich, wenn du indexOf() nimmst.

    Gruß,

    Dieter

    1. Hej,

      Hallo Biesterfeld,

      Da kommst Du ganz ohne regulaeren Ausdruck aus, naemlich, wenn du indexOf() nimmst.

      Hab die faxen dick und geh ins Bett! Ich danke dir, mein konkretes Problem ist gelöst.

      Ähm unabhängig davon würde mich dennoch grundsätzlich das allgemeine Problem interessieren. Wer mir für die Zukunft nen Tip geben könnte...

      Danke schon mal an alle.

      Beste Grüße
      Biesterfeld

  2. Привет Biesterfeld.

    Ergänzend zu der hier ausreichenden Variante von Dieter noch ein bisschen Gelaber von mir :)

    Das Problem ist nun dass ich in Selfhtml nüscht gefunden habe, dass ich einen String mit dem _Variableninhalt_ abgleichen kann.

    Oh, das glaube ich dir nicht. Du machst den Fehler, den RegEx als Variable einbauen zu wollen, was IMHO die search-Funktion nicht hergibt. Also entweder du machst sowas:

    var str = document.eingabe.loesung.value;
    if(str.search(/schatten/) != -1) {
      alert("Bestens");
    }

    Oder du bedienst dich gleich des RegExp-Objektes:

    var re = new RegExp('(schatten)|(echo)');
    if(re.test(str)) {
      alert("Bestens");
    }

    Aber ich stimme Dieter zu, dass indexOf() für dein Vorhaben ausreichend sein sollte.

    Дружба!
    Siechfred

    --
    Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
    1. Hallo,

      Du machst den Fehler, den RegEx als Variable einbauen zu wollen, was IMHO die search-Funktion nicht hergibt.

      str.search(/schatten/)

      var re = new RegExp('(schatten)|(echo)');
      if(re.test(str)) {

      Vielleicht zur Erklärung: Die search-Methide hat nichts damit zu tun, wie das RegExp-Objekt erzeugt wird. »/.../« ist nichts anderes als die Kurzschreibweise (»Literal«) für »new RegExp(...)«. Diese Varianten sind in nahezu allen Kontexten austauschbar (eventuell sind zusätzliche Klammern nötig).

      str.search(new RegExp("schatten")) wäre formal korrekt.
      Dasselbe gilt für entsprechend für
      var re = new RegExp("schatten");
      str.search(re);

      Dementsprechend kann man in beiden Fällen Variablen in den regulären Ausdruck einbauen, egal, ob der Ausdruck letztlich zusammen mit match(), replace(), search() von String-Objekten oder exec() oder test() des selbigen RegExp-Objekts verwendet wird.

      Das ist alles möglich:

      var string = "blafaselfoobar";
      var gesuchteswort = "foo";
      var regausdruck = new RegExp(gesuchteswort);
      var ergebnisse = regausdruck.exec(string);
      var ergebnis = regausdruck.test(string);
      var treffer = string.match(regausdruck);
      var trefferposition = string.search(regausdruck);
      var string2 = string.replace(regausdruck, "bar");

      Wahrscheinlich sage ich dir nichts Neues, aber der obige Satz klang etwas missverständlich.

      Mathias

      1. Привет molily.

        Du machst den Fehler, den RegEx als Variable einbauen zu wollen, was IMHO die search-Funktion nicht hergibt.
        Vielleicht zur Erklärung: [...]

        Ja, zugegeben, es war etwas missverständlich formuliert, resultierend aus der Perl-Syntax, die der OP anwenden wollte:

        my $muster = '(schatten)|(echo)';
        if ( $str =~ /$muster/ ) { ... }

        Die 1:1 Entsprechung in JS wäre

        var muster = '(schatten)|(echo)';
        erg = str.search(/muster/);

        Und das geht m.W.n. so nicht, siehe die von dir geposteten Beispiele.

        Дружба!
        Siechfred

        --
        Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
  3. hallo Biesterfeld

    var text = "Schatten";
    var text_2 = "Der Schatten";

    if (text.indexOf(text_2) != -1 || text_2.indexOf(text) != -1)
        alert("ok");

    wäre das ne variante ohne regexpressions?

    gruss LenaLuna

    1. Hallo LenaLuna,

      Der Tip mit indexOf() war schon für mein Problem voll zutreffend. Allgemein ist mir ja auch gezeigt worden wie ich mit dem Objekt RegExp() variable Ausdrücke anwenden kann (Danke Siechfred!).

      Das hier hab ich aber ja erst jetzt gesehen.

      var text = "Schatten";
      var text_2 = "Der Schatten";

      if (text.indexOf(text_2) != -1 || text_2.indexOf(text) != -1)

      liefert immer true! weil (text_2.indexOf(text) != -1) = true und (text.indexOf(text_2) != -1) = false!

      Danke Dir trotzdem. ;) Beste Grüße
      Biesterfeld

  4. Hallo Biesterfeld,

    hab jetzt keine Lust mehr darüber nachzudenken, aber ich habe einige Funktionen dazu geschrieben. Teste sie einfach mal. Mit den kleinen roten Pfeilen nach rechts kommst Du jeweils zum Quelltext.

    Gruß, Andreas

    --
    SELFFORUM - hier werden Sie geholfen,
    auch in Fragen zu richtiges Deutsch
    1. Hej Andreas,

      Teste

      Habs mir noch nicht in seiner ganzen Ausführlichkeit durchgelesen, aber sehr schön und sehr anschaulich geschrieben. Hat mir super gefallen!

      Vielen Dank und beste Grüße
      Biesterfeld