trim() en AS3
Par Cédric Tabin le jeudi 07.08.2008, 17:00 - ActionScript - Lien permanent
Il est souvent utile de supprimer tout caractère invisible (espace, tabulation, ...) en début et fin de chaîne. Malheureusement, la méthode String.trim() de java n'existe pas en AS3... Du coup, on en revient à nos bonnes RegExp pour solutionner le problème !
Et c'est assez simple à faire :
var r:RegExp = /^\s*(.*?)\s*$/g var s:String = " Ceci est une chaîne avec des espaces "; var t:String = s.replace(r, "$1"); trace(t);
Pour ceux qui aimeraient ajouter cette fonction par défaut à la classe String, le morceau de code suivant fonctionne (il faut désactiver le mode strict à la compilation) :
String.prototype.trim = function():String { return this.replace(/^\s*(.*?)\s*$/g, "$1"); } var s:String = " Ceci est une chaîne avec des espaces "; trace(s.trim());
Par ailleurs, en faisant cette fonction, je pense être tombé sur un bug du compilateur flash :
String.prototype.trim = function():String { var r:RegExp = /^\s*(.*?)\s*$/g return this.replace(r, "$1"); }
Ca ne compile pas et flash nous informe qu'il y a une erreur de synthaxe sur la ligne de déclaration de la RegExp :
1083: Syntax error: div is unexpected.
C'est assez louche, j'en ai discuté sur le chat IRC de MediaBox avec NiKo notamment, mais nous n'avons pas trouvé l'origine du problème... Si quelqu'un a des informations je suis preneur !
Commentaires
Il n'y a pas de point virgule ?
http://www.adobeforums.com/webx?14@...
Salut neo
Effectivement j'avais essayé avec new RegExp mais visiblement l'expression ne fonctionnait plus... peut-être en relation du fait que le \w ne marche pas non plus selon le post que tu m'as envoyé. Je vais approfondir la chose !
Merci bien pour le lien.
@++
Hello
Pour le moment pas de RegExp pour moi pour cette fonctionnalité et une implémentation plus traditionnelle :
http://svn1.cvsdude.com/osflash/veg...
Voir les méthodes trim, trimStart et trimEnd basés sur la méthode privé _trimHelper.
Cette méthode reste efficace et rapide dans prise de tête Je ne suis vraiment pas certain que les RegExp puissent être une solution dans tous les cas de figure. Après faudra faire des benchs peut être... mais ceci est une autre histoire
EKA+
Salut Eka
Intéressant ton implémentation, toutefois je suis pas partisan... Je trouve bien plus facile de faire tout cela via RegExp : plus lisible, moins de code, donc moins de probabilité de bug, etc Mais bon au final ça reste du code et tant que ça marche ça roule :D
@++
Pour des fonctions de ce niveau, ce qui prime, c'est la vitesse, plus que la technique.
Bonjour,
J'ai juste une question. pourquoi .*? fonctionne très bien et pas .+ ou .* ?
Salut,
C'est une question de quantificateur Le fait de mettre .*? indique que l'on prend la chaine de caractère la plus courte correspondant à la regexp. En l'occurance dans la regexp .*, il y a aussi les caractères espacés Donc si tu ne précises pas le quantificateur ? le moteur de regexp ne va pas considérer la 2ème regexp \s*
Une autre solution sans quantificateur aurait été /^\s*(\w*)\s*$/g
@++
Cette fonction est déjà dispo dans Flex, dans mx.utils.StringUtil.trim()
Pour remplacer un caractère par un autre, j'utilise un bon vieux split-join qui a toujours répondu a tous mes besoins:
var test:String = "Bonjour ceci est un test";
var res:String = (test.split(" ")).join("");
trace(res)
non ?
Post ancien, mais pour corriger ce bug du compilateur, il faut faire :
String.prototype.trim = function():String
{
}
merci au lien plus haut
Julien
Je débarque sur un vieux post mais j'en profite pour dire :
merci pour le regex !
@peko : avec splitjoin t'enlèves tous les espaces, pas seulement ceux avant et après.