validar validación traductor regulares puntocomnoesunlenguaje para nombres nombre lista expresiones java regex string stringbuilder

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>")); }

Ver una demostración de código de prueba!


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 .

Demo de trabajo.