RegExp
Biesterfeld
- javascript
2 Dieter Raber2 Siechfred-1 LenaLuna1 Andreas Lindig
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
Hallo Biesterfeld,
Da kommst Du ganz ohne regulaeren Ausdruck aus, naemlich, wenn du indexOf() nimmst.
Gruß,
Dieter
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
Привет 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
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
Привет 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
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
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
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
Hej Andreas,
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