replaceAll pour StringBuilder avec la regex de soutien?
J'ai regardé dans l'API Java et certaines communes de la 3e partie des bibliothèques, mais je suis incapable de trouver une méthode qui permettra de faire ce que Chaîne de caractères.replaceAll, sauf pour StringBuilder.
Je sais qu'avec un peu de travail, il peut être fait pour StringBuffer, mais je ne veux pas aller dans cette voie, parce que StringBuffer est plus lent.
Personne ne sait d'un 3ème partie utilitaires, ou si il y a rapidement un morceau de code pour implémenter cette fonctionnalité?
Est-ce que la critique pour les performances ou telle grande chaîne de conversion d'une chaîne et de faire le remplacer (et de le convertir en arrière si nécessaire) est hors de question?
Vous pouvez créer un
Oui, mais que l'on utilise StringBuffer ...
En fait, vous n'avez même pas besoin de tout ce que
Je vois ce que tu veux dire maintenant. Le
Vous pouvez créer un
Matcher
(qui peuvent être créés sur n'importe quel CharSequence
), puis d'écrire une boucle avec appendReplacement
et appendTail
écrire votre propre replaceAll
.Oui, mais que l'on utilise StringBuffer ...
En fait, vous n'avez même pas besoin de tout ce que
append*
magie... Matcher
fournit sa propre replaceAll
.Je vois ce que tu veux dire maintenant. Le
append*
fonctions prennent un StringBuffer ainsi... juste assez.OriginalL'auteur Jin Kim | 2013-06-28
Vous devez vous connecter pour publier un commentaire.
String.replaceAll
est juste une méthode pratique pourMatcher.replaceAll
.Matcher
est la "façon" d'utiliser des regex en Java et permet beaucoup plus sophistiqué des cas d'utilisation.En outre, tout ce qui peut être fait avec la regex méthodes sur
String
peut être fait avec des méthodes similaires sur unMatcher
. La beauté est, queMatcher
s travailler avec plus que justeString
s:Matcher
s peut être obtenu pour touteCharSequence
(une interface, qui est mis en œuvre parStringBuilder
,StringBuffer
,String
etCharBuffer
). Ainsi, vous pouvez simplement faire:Sortie
This works with StringBuilders
.Travail de démonstration.
m.relaceAll
en interne l'utilisation de StringBuffer et de la Chaîne de retour avec remplacée données. Je crois que l'OP veut savoir est-il un moyen d'utiliser StringBuilder au lieu de StringBuffer comme nous l'utilisons dansMatcher#appendReplacement()
mais je me trompe peut-être. OP commentaire serait mieux ici.ah ok, je ne savais pas que
Matcher
utilise un StringBuffer en interne.Fondamentalement, j'ai la signature de méthode suivante:
public void replaceAll(final StringBuilder builder, final String regex, final String replacement)
. Le générateur de données devrait être modifié sans avoir à faire tout reassignement.OriginalL'auteur Martin Ender
Vrai, mais avec de l'habitude de l'optimisation prématurée mise en garde, et, plus important encore, moderne Jvm utilisation échapper à l'analyse de supprimer le StringBuffer/Vecteur/HashTable serrures dans certains cas, donc, une fois que l'optimisation se produit, le rendement sera à peu près la même.
OriginalL'auteur David Ehrmann
Apache Harmony Comparateur de code source semble pleinement reworkable pour être utilisé avec
StringBuilder
au lieu de celle actuellement utiliséeStringBuffer
, il suffit de déplacer à l'autre. Il ne semble pas glisser beaucoup de dépendances. Licence Apache qui est au début du fichier ne peut pas être mauvais, même pour un projet commercial.GNU Classpath code peuvent également être réutilisés, mais la licence est plus difficile là (vous avez besoin de publier une version modifiée de la Correspondance, mais probablement pas le reste de votre code). Même à propos de l'origine du Soleil de mise en œuvre qui peut être trouvé ici dans le projet OpenJDK.
OriginalL'auteur h22
Regex ne modifie pas les mutable
CharSequence
en interne. Regex analyse unCharSequence
retour d'unString
, oùString
est le résultat.StringBuffer
est une exception, car il y a une manipulation spéciale - comme pourStringBuilder
êtreCharSequence
, vous devez le modifier avec un résultat de match.Ce que vous pouvez faire à la place:
Affichage d'un code d'essai de la démo!
OriginalL'auteur Unihedron