java - traductor - validación de expresiones regulares
¿Reemplazar todo para StringBuilder con soporte de expresiones regulares? (4)
No quiero ir por este camino porque StringBuffer es más lento.
Es cierto, pero con la habitual advertencia de optimización prematura, y lo que es más importante, las JVM modernas utilizan el análisis de escape para eliminar los bloqueos StringBuffer / Vector / HashTable en ciertos casos, por lo que una vez que se realice la optimización, el rendimiento será aproximadamente el mismo.
He buscado en la API de Java y en algunas bibliotecas de terceros comunes, pero no puedo encontrar un método adecuado que haga lo que String.replaceAll hace, excepto StringBuilder.
Sé que con un poco de trabajo, se puede hacer para StringBuffer, pero no quiero ir por este camino porque StringBuffer es más lento.
¿Alguien sabe de alguna utilidad de terceros, o si hay una pieza rápida de código para implementar esta funcionalidad?
El código fuente de Apache Harmony Matcher parece completamente reutilizable para ser utilizado con StringBuilder
lugar del StringBuffer
utilizado actualmente, simplemente muévase al paquete diferente. Parece que no arrastra muchas dependencias con él. La licencia de Apache que está al comienzo del archivo puede no ser mala incluso para un proyecto comercial.
El código de Classpath de GNU también se puede reutilizar, pero la licencia es más difícil allí (debe publicar su versión modificada de Matcher, pero probablemente no el resto de su código). Lo mismo acerca de la implementación original de Sun que se puede encontrar here en el proyecto OpenJDK.
Regex no modifica internamente una CharSequence
mutable. Regex analiza un CharSequence
para devolver un String
, donde String
es el resultado. StringBuffer
es una excepción ya que hay un manejo especial, ya que para que StringBuilder
sea CharSequence
, debe modificarlo con un resultado coincidente.
Lo que puedes hacer en su lugar:
// Class
private static final Pattern MY_PATTERN = Pattern.compile("my|regex");
{ // Method
StringBuilder builder;
// ...
Matcher m = MY_PATTERN.matcher(builder);
builder.replace(0, builder.length(), m.replaceAll("<b>$0</b>"));
}
String.replaceAll
es solo un método conveniente para Matcher.replaceAll
. Matcher
es la forma "real" de usar expresiones regulares en Java y permite casos de uso mucho más sofisticados.
Además, cualquier cosa que se pueda hacer con los métodos de expresiones regulares en String
se puede hacer con métodos similares en un Matcher
. La belleza es que el trabajo de Matcher
con más que solo String
s: Matcher
s se puede obtener para cualquier CharSequence
(una interfaz, que es implementada por StringBuilder
, StringBuffer
, String
y CharBuffer
). Así que simplemente puedes hacer:
import java.util.regex.*;
...
StringBuilder sb = new StringBuilder();
sb.append("This works with StringBuffers");
Pattern p = Pattern.compile("//Buffer//B");
Matcher m = p.matcher(sb);
System.out.println(m.replaceAll("uilder"));
Será salida This works with StringBuilders
.