Hinzufügen der replaceAll-Methode der String-Klasse von ActionScript
Brauche ich etwas Hilfe, indem die alle ersetzen-Funktionalität in mein Flex-Projekt. Ich würde es vorziehen, dies zu tun in einer Weise, die so natürlich wie möglich.
Was ich erreichen will ist, um in der Lage sein, diesen code auszuführen (mit der Flex-compiler) "aabbaaba".replaceAll("b","c")
und bekommen "aaccaaca"
. Auch ich möchte die Kette replaceAll
Anrufe.
Hinweis: ich werde nicht wirklich ersetzen b
s mit c
s, aber verschiedene string, der nicht bekannt ist, Codierung Zeit!
Was ich nicht will:
1. Reguläre Ausdrücke verwenden mit dem global-flag. Die Token zu ersetzen bestimmt sind Anzeige der Laufzeit und verwandelt Sie in einen regulären Ausdruck ist nicht geradlinig.
2. Verwenden Sie die StringUtil.replace
Methode. Es ist eine statische Methode und chaining ist hässlich.
3. Kette split
und join
. Da kann es verwirrend sein, für andere beim Lesen den code.
4. Deaktivieren der strengen Typüberprüfung. Ich will die Typprüfung für den rest von meinem code.
Hier ist was ich habe, so weit:
String.prototype.replaceAll = function(replace:String, replaceWith:String):String{
return this.split(replace).join(replaceWith);
}
Und können benannt werden:
"aababacaaccb"["replaceAll"]("b", "c")["replaceAll"]("c", "a");
Außerdem gibt es Empfehlungen gegen eine Verlängerung der Objekte durch den Prototyp? Werde ich auch akzeptieren eine Antwort, die starke Argumente gegen die Ausweitung des String-Objekt über den Prototyp.
Danke,
Alin
wtf??? Sie will nicht regex? was ist der Punkt, das auch zu tun-string-suchen/ersetzen-dann überhaupt? Sie ersetzen eine Zeichenfolge. Verwenden Sie ein string-Funktion. Es ist nicht schwer zu verwenden, eine variable in einer regex .........
Sie wahrscheinlich nicht verstehen, die Frage. Oder nicht gelesen haben, es mit genügend Aufmerksamkeit. Was ich will, zu tun ist, was
StringUtil.replace
tut, aber direkt wie eine Methode auf, meinen String-Objekt. Ich habe keine Muster, ich habe nur eine Zeichenfolge, die ich ersetzen möchten. Es gibt eine Menge von Möglichkeiten, dies zu tun, aber ich wollte etwas clean (wie eine Methode, die auf Strings) oder so sauber wie möglich (wie das, was 9re oder Juan Pablo Califano vorgeschlagen).Auch Sie sind nicht kohärent. Ich beziehe mich nicht auf Sie schlechte Englisch (das ist seltsam, weil Ihr Profil besagt, dass Sie aus New York), sondern um die Tatsache, dass Sie Widerspruch zu sich selbst. Zum Beispiel: "Sie will nicht von regex?" vs. "sind Sie ersetzt eine Zeichenfolge. Verwenden Sie ein string-Funktion.".
Auch Sie haben schien, um Ihre eigene Frage zu beantworten. Sie besagt, das Sie ersetzen möchten, aber Sie wollen nicht, um einen regex verwenden, noch beitreten, noch aufteilen, noch StringUtil.ersetzen, noch die Art der überprüfung. wtf. StringUtil.der Prototyp.replaceAll = function(r:String, B:String):String { return this.replace(new RegExp(r, 'g'), w); )
InformationsquelleAutor Alin Purcaru | 2010-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, du hast alle technischen Antworten möglich. Ich werde weiter in dem, was ich denke, ist der beste Weg, dies zu nähern sprachlich.
Prototypen sind nicht empfohlen, in eine OOP-Sprache wie AS3 (vor allem, weil Sie trotzen Kapselung). Sie deuten an, dass Sie nicht wollen, etwas "verwirrend für andere" (in Bezug auf split.join); Prototypen in AS3 sind sehr verwirrend.
Nur als ein Beispiel, ein Prototyp-Deklaration kann von überall in Ihrem code, und als solcher ist nicht ersichtlich, wo es sich befinden sollte. Wenn "die anderen" begegnen "foo".replaceAll() in deinem code, es ist überhaupt nicht klar wo kann man feststellen, dass Methode und prüfen Sie, was Sie wirklich tut.
Eine statische Funktion ändert dies und ist ziemlich straight-forward. Sicher, man braucht ein zusätzliches argument, und man kann wirklich nicht die Kette richtig, aber ist das so schlimm?
Wenn Sie brauchen Leistung, aufgeteilt.join ist der Weg zu gehen. Ich würde Wetten gutes Geld, mehr AS3 devs wissen über split.join als die Verwendung von Prototypen.
Auf der anderen Seite, ich denke, die meisten, semantischer und pragmatischer Weg wäre, um die eigene Sprache Methode (daher auch meine Vorherige Antwort). Sie versuchen, Sie zu ersetzen alle Nadeln in einer Zeichenfolge mit einer anderen Zeichenfolge in AS3, und die Sprache hat die String::replace-Methode mit der global-flag. Ich bin mir ziemlich sicher, dass es ist ein Weg, um leicht analysieren und jede beliebige Zeichenfolge verwenden, in regexp.
Ich Stimmen darin überein, dass in einigen Fällen eine helper-Methode (wie replaceAll) erforderlich sein könnten, aber ich würde stark dazu raten, Sie nicht zu verwenden, Prototypen und stattdessen ein standard-Weg, wie StringUtil.ersetzen.
InformationsquelleAutor Cay
Die zweite Antwort ist diese:
schreiben Sie die wrapper-Klasse StringEx für String-und Sie können festlegen, replaceAll verkettet werden können, wie dies
indem Sie toString() können Sie leicht ändern Sie StringEx Objekt in String
können Sie Holen Sie sich die Vollversion hier: OOP-Weg von Prototyp-Erweiterung - wonderfl build flash online
InformationsquelleAutor 9re
Warum nicht? für einfache string-Ersetzungen ist ziemlich geradlinig und performant:
oder, wenn Sie bevorzugen:
Ich würde nicht empfehlen, mit Prototyp für diese, es ist nicht sehr OOP noch standard... fühlt es sich auch an hacky für solch einen einfachen Vorgang.
a
,b
undc
um deutlich zu machen, was ich will. Ich glaube nicht, es war notwendig, es zu sagen. Ich möchte in der Lage sein, Sie zu ersetzen eine beliebige Zeichenfolge mit einer beliebigen Zeichenfolge bestehen. Ich bearbeitet die Frage.Auch Sie können nicht tun
RegExp(needle,"g")
zu konvertieren einen string in dem regulären Ausdruck, der findet (weil der spezielle regex-Symbole). Ihre Antwort ist die schlechteste, so weit Sie nicht sogar versuchen. Ich verstehe nicht, warum jemand würde bis-Abstimmung...Sie sind ein bisschen zu herablassend für meinen Geschmack... du hast Recht, obwohl es nicht, dass gerade nach vorne für eine beliebige Zeichenfolge, aber ich bin sicher, Sie könnte der Arbeit, (ich würde split.join BTW)...
InformationsquelleAutor Cay
Ich kann nicht denken Sie an einen Weg, um zu treffen die 4 Voraussetzungen, die Sie gebucht. Aber ich denke, wenn das Ihr Ziel ist das ersetzen von verschiedenen Token in one go (was Sie erreichen wollten mit Verkettung der Aufrufe), während in der Lage zu verwenden, jede beliebige Zeichenfolge als token können Sie versuchen, so etwas wie dieses:
Es gibt eine Einschränkung zu beachten. Mit einem Objekt zu Objekt, die Reihenfolge ist nicht garantiert. In den meisten Fällen ist dies nicht wichtig, aber wenn in Ihrem Fall ist es, könnte man ein Array verwenden, statt, und in jedem slot speichern des Tokens und seinem Ersatz (als ein Objekt, zum Beispiel).
replaceAll
auf das String-Objekt kann nicht getan werden?Naja, ich meinte, dass ich kann nicht einen Weg finden mich. Und wahrscheinlich gibt es nicht (aber vielleicht jemand findet, wer weiß). Wenn Sie gehen, der Prototyp route, die Sie verlieren, Typ-überprüfung, wie Sie wissen. Für alle der code, der diese Methode verwendet; es gibt vielleicht einen Weg um dies zu vermeiden, die für "den rest von deinem code", aber das wird sicher eingebunden werden (wenn möglich).
(Fortsetzung) Verlängerung der String ist nicht möglich, weil die Klasse final ist, so dass die Verwendung von Objekt-Instanzen (für die Verkettung von Methoden und so weiter) erfordern zusätzliche boiler-plate (Sie können haben eine Art wrapper, aber es kann nicht verwendet werden, waren eine Zeichenfolge erforderlich ist; dies ist, wo ich denke du wirst die meisten der Kessel-Platte). Also ich denke, dass eine statische utility-Methode ist die einfache, direkte und intuitive Möglichkeit gegeben die Umstände.
InformationsquelleAutor Juan Pablo Califano
"aabbaaba".split('b').join('c')
gibt 'aaccaaca'UPD:
ich Frage mich, warum es inakzeptabel ist für Sie (aber es keine Unterstützung für regexp): es funktioniert ziemlich schnell (geprüft in schweren loops) und tut genau das, was Sie wollen.
und auch da gibt es ein paar Lösungen, die nicht erwähnt in Ihrer blacklist (btw statische Funktion ist besser als messing mit Prototyp - imho):
replaceAll
Methode undsuper()
nennen. Instanzen dieser Klasse zurücktrue
wenn Sie das Kontrollkästchen(myStringInstance is String)
oh, das habe ich wirklich verpasst 🙁
"btw statische Funktion ist besser als messing mit Prototyp" - Könnten Sie dies erläutern?
Ich will nicht, split+join, weil es nicht offensichtlich ist, was die Kombination bedeutet. Es ist mir klar, weil ich weiß, wie
StringUtil.replace
umgesetzt wird, aber wahrscheinlich nicht für einige andere, die Lesen werden, mein code.InformationsquelleAutor www0z0k
Ich habe zwei Antworten für Sie. Das erste wäre, was Sie wollen. Ich empfehle aber das zweite.
aktivieren Prototypen in flex ist sehr einfach und kann getan werden durch einstellen von flex-config
ReplaceAllTest.als
ReplaceAllTest-config.xml
Ich immer noch davon abgeraten, diese Weise, da das aktivieren prototyping-und ausschalten strict-Modus verlangsamt den code.
oh, tut mir Leid! Ich habe einen Fehler gemacht. aber der compiler.es muss festgelegt werden, mit compiler.strenge false: livedocs.adobe.com/flex/3/html/...
Purcaru. Ich denke, Sie sind ein bisschen zu aufdringlich wenn man bedenkt, dass Sie gefragt sind, anderen Menschen zu helfen, Sie lösen Ihr problem (und dass Sie versucht, Ihnen zu helfen, ohne etwas von Ihnen im Gegenzug).
Ich weiß, ich bin und ich möchte mich dafür entschuldigen, aber das ist ein Charakter-problem, nicht eine Programmiersprache. Ich glaube nicht, dass es (noch) einen Stapel exchange-Standort, der dieses Problem behebt :). Ich glaube, ich wurde frustriert, wenn ich sah, Antworten, die genau das Tat, was ich ausdrücklich sagte ich will nicht. Als für das problem, das Teil ging ich mit der
[]
bevor ich die Frage gepostet. Man kann also nicht wirklich sagen, dass ich müssen ein problem schnell lösen, sondern ich würde gerne hören, einige kompetente Meinungen von anderen Programmierern, die dieses Problem angegangen.Ok, ich wollte nur erwähnen, nett zu sein, tut nicht weh (auch wenn Sie die gegebene Antwort unbefriedigend). Wie auch immer, ich werde Entsendung eine mögliche option.
InformationsquelleAutor 9re
Ich weiß, dies ist ein Alter thread, aber das ist, was ich kam mit, die können eine regelmäßige Zeichenfolge.
InformationsquelleAutor Dimchao