Nils N.: Problem mit String-replace()-Funktion

Hallo,
nach langem ausprobieren komme ich einfach nicht auf die Lösung zu meinem Problem.
Ich habe eine Funktion geschrieben, mit der ich aus einem String per .replace() einzelne Teilstrings ersetzen möchte. Leider funktioniert das nicht, so wie ich das will.

So sieht die Funktion aus (zur Übersicht ein wenig gekürzt):

String.prototype.toHiragana = function () {
 hiragana = this.replace(/.*h[(.*)]h.*/, '$1');

hiragana = hiragana.replace(/kya/g, "ki_ya");
 hiragana = hiragana.replace(/kyu/g, "ki_yu");
 hiragana = hiragana.replace(/kyo/g, "ki_yo");
 ...
 hiragana = hiragana.replace(/u/g, "う");
 hiragana = hiragana.replace(/i/g, "い");
 hiragana = hiragana.replace(/a/g, "あ");

return this.replace(/h[.*]h/, hiragana);
}

Die erste Zeile holt den Text aus von mir ausgedachten Tags (h[...]h). Dann sollen Teilstrings im Text ersetzt werden. Danach soll der ersetzte Text anstatt dem Text innerhalb der Tags im Originalstring als Rückgabewert zurückgegeben werden.

Die Funktion will einfach nicht laufen. Wenn ich die Zeilen mit 'hiragana = hiragana.replace(...)' rauskommentiere, funktioniert die Funktion aber, es muss also an diesen Zeilen liegen. Ich habe schon so viel ausprobiert, der Fehler will aber einfach nicht von mir gefunden werden. Insgesamt habe ich 130 solcher Zeilen. Liegt es vielleicht daran? Also Gibt es vielleicht eine Maximalgrenze für nacheinander mögliche replaces?

Mfg Nils

  1. Die Funktion will einfach nicht laufen. Wenn ich die Zeilen mit 'hiragana = hiragana.replace(...)' rauskommentiere, funktioniert die Funktion aber, es muss also an diesen Zeilen liegen. Ich habe schon so viel ausprobiert, der Fehler will aber einfach nicht von mir gefunden werden.

    Wenn es ein Fehler ist, steht dieser in der Fehlerkonsole.

    Also Gibt es vielleicht eine Maximalgrenze für nacheinander mögliche replaces?

    Nein.

    Struppi.

  2. Hi,

    hiragana = hiragana.replace(/kyu/g, "ki_yu");
    hiragana = hiragana.replace(/u/g, "う");

    erhöhe die Effizienz, indem Du gleich "kyu" durch "ki_yう" ersetzt.

    Die Funktion will einfach nicht laufen.

    Which means?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      hiragana = hiragana.replace(/kyu/g, "ki_yu");
      hiragana = hiragana.replace(/u/g, "う");

      erhöhe die Effizienz, indem Du gleich "kyu" durch "ki_yう" ersetzt.

      Äh, ja klar, hab ich gar nicht dran gedacht. Danke

      Die Funktion will einfach nicht laufen.

      Which means?

      Also wenn ich diese Zeilen rauskommentiere, dann läuft die Methode, d.h. die Befehle, natürlich bis auf die rauskommentierten, werden ausgeführt. Wenn ich diese Kommentare aber nicht setze, dann werden gar keine Befehle mehr ausgeführt, weder die der .toHiragana()-Methode, noch anderer Funktionen/Methoden.

      Also, da es keine Kommentare diesbezüglich gab, scheinen die Zeilen syntaktisch richtig zu sein, also ohne Rechtschreibfehler oder sonstigem, richtig? Ich möchte euch das nicht antun, hier hunderte von Zeilen replace-Code zu posten (ich habe auch noch ne toKatakana()-Funktion ^^) Also gibt es bei der .replace-Methode irgend welche Kompatibilitätsprobleme oder so, welche ein solches Verhalten erklären?

      Ich erhalte auch keine Fehlermeldung.
      Ich nutze aber momentan auch nur den normalen Firefox, ohne Programmier-Extensions. Muss ich extra welche installieren, damit ich JavaScript-Fehlermeldungen erhalte? Ich dächte, dass das schon integriert ist, wie beim InternetExplorer. Fals dem nicht so ist, bitte ich um Aufklärung und entschuldigt bitte die -wahrscheinlich- dämliche Frage.

      PS: Vielen Dank für eure Hilfen.

  3. Hi Nils!
    Versuch doch mal folgendes:

    String.prototype.toHiragana = function () {
    hiragana = this.replace(/.*h[(.*)]h.*/, '$1');

    alert("fromTag:" + hiragana);

    hiragana = hiragana.replace(/kya/g, "ki_ya");

    alert("replaced ki_ya:" + hiragana);
    (...)
    alert("returning:" + this.replace(/h[.*]h/, hiragana));

    return this.replace(/h[.*]h/, hiragana);
    }

    und überprüfe anhand der alerts, ob alle Strings zwischendurch in Ordnung sind.

    Grüsse,
    Richard

  4. Hallo,
    nach langem ausprobieren komme ich einfach nicht auf die Lösung zu meinem Problem.
    Ich habe eine Funktion geschrieben, mit der ich aus einem String per .replace() einzelne Teilstrings ersetzen möchte. Leider funktioniert das nicht, so wie ich das will.

    So sieht die Funktion aus (zur Übersicht ein wenig gekürzt):

    String.prototype.toHiragana = function () {
    hiragana = this.replace(/.*h[(.*)]h.*/, '$1');

    hiragana = hiragana.replace(/kya/g, "ki_ya");
    hiragana = hiragana.replace(/kyu/g, "ki_yu");
    hiragana = hiragana.replace(/kyo/g, "ki_yo");
    ...
    hiragana = hiragana.replace(/u/g, "う");
    hiragana = hiragana.replace(/i/g, "い");
    hiragana = hiragana.replace(/a/g, "あ");

    return this.replace(/h[.*]h/, hiragana);
    }

    Die erste Zeile holt den Text aus von mir ausgedachten Tags (h[...]h). Dann sollen Teilstrings im Text ersetzt werden. Danach soll der ersetzte Text anstatt dem Text innerhalb der Tags im Originalstring als Rückgabewert zurückgegeben werden.

    Die Funktion will einfach nicht laufen. Wenn ich die Zeilen mit 'hiragana = hiragana.replace(...)' rauskommentiere, funktioniert die Funktion aber, es muss also an diesen Zeilen liegen. Ich habe schon so viel ausprobiert, der Fehler will aber einfach nicht von mir gefunden werden. Insgesamt habe ich 130 solcher Zeilen. Liegt es vielleicht daran? Also Gibt es vielleicht eine Maximalgrenze für nacheinander mögliche replaces?

    Mfg Nils

    Okay, ich habe es jetzt hinbekommen.
    Die einfachste Lösung war die beste, wie so oft im real life:

    Ich darf bei der replace()-Methode keine regülären Ausdrücke verwenden, sondern nur normale Strings. D.h. aus

    replace(/u/g, "う"); -> replace("u", "う");
    replace(/i/g, "い"); -> replace("i", "い");
    replace(/a/g, "あ"); -> replace("a", "あ");

    Ich verstehe zwar nicht, warum die regulären Ausdrücke hier nict funktioniert haben, aber es ist eigentlich egal. So funktioniert es bestens.

    Vielen Dank nochmals für eure Zeit

    MfG Nils

    1. Okay, ich habe es jetzt hinbekommen.
      Die einfachste Lösung war die beste, wie so oft im real life:

      Ich darf bei der replace()-Methode keine regülären Ausdrücke verwenden, sondern nur normale Strings. D.h. aus

      replace(/u/g, "う"); -> replace("u", "う");
      replace(/i/g, "い"); -> replace("i", "い");
      replace(/a/g, "あ"); -> replace("a", "あ");

      Ich verstehe zwar nicht, warum die regulären Ausdrücke hier nict funktioniert haben, aber es ist eigentlich egal. So funktioniert es bestens.

      Vielen Dank nochmals für eure Zeit

      MfG Nils

      Mist, funktioniert doch nicht.
      So werden die Teilstrings jeweils nur einmal ersetzt. Wenn ein solcher Teilstring mehrmals im Originalstring auftaucht, wird der nicht mehr ersetzt und das Ergebnis stimmt nicht.

      Also, wieder zurück zum alten Problem...

    2. Ich darf bei der replace()-Methode keine regülären Ausdrücke verwenden, sondern nur normale Strings. D.h. aus

      replace(/u/g, "う"); -> replace("u", "う");
      replace(/i/g, "い"); -> replace("i", "い");
      replace(/a/g, "あ"); -> replace("a", "あ");

      Ich verstehe zwar nicht, warum die regulären Ausdrücke hier nict funktioniert haben,

      Wieso sollten die nicht funktionieren?
      Kannst du mal ein Beispiel zeigen.

      Struppi.

      1. Ich darf bei der replace()-Methode keine regülären Ausdrücke verwenden, sondern nur normale Strings. D.h. aus

        replace(/u/g, "う"); -> replace("u", "う");
        replace(/i/g, "い"); -> replace("i", "い");
        replace(/a/g, "あ"); -> replace("a", "あ");

        Ich verstehe zwar nicht, warum die regulären Ausdrücke hier nict funktioniert haben,

        Wieso sollten die nicht funktionieren?
        Kannst du mal ein Beispiel zeigen.

        Struppi.

        Ahhh, sorry, blöder Fehler.
        Ich hatte im Code folgende Zeile:

        hiragana = hiragana.replace(/+/g, "っ");

        Die musste ich erst in:

        hiragana = hiragana.replace(/+/g, "っ");

        umschreiben.
        Tut mir sorry. Hab euch total unnötig genervt. Jetzt klappts ^^'

        MfG Nils