Red de conocimiento informático - Consumibles informáticos - Maestro Jin, una pregunta sobre programación Java

Maestro Jin, una pregunta sobre programación Java

Usa la expresión regular de Java. Puedes buscar el código específico. La idea general es incluir puntos decimales al principio de los números.

Si alguna vez ha utilizado Perl o cualquier otro lenguaje con soporte integrado para expresiones regulares, debe saber lo fácil que es usar expresiones regulares para procesar texto y hacer coincidir patrones. Si no está familiarizado con el término, una "expresión regular" es una cadena de caracteres que define un patrón utilizado para buscar cadenas coincidentes.

Muchos lenguajes, incluidos Perl, PHP, Python, JavaScript y JScript, admiten el uso de expresiones regulares para procesar texto, y algunos editores de texto usan expresiones regulares para implementar funciones avanzadas de "búsqueda y reemplazo". Entonces ¿qué pasa con Java? Al momento de escribir este artículo, se aprobó una solicitud de especificación de Java que cubre el procesamiento de texto con expresiones regulares y puede esperar verla en la próxima versión del JDK.

Sin embargo, ¿qué pasa si necesitas usar expresiones regulares ahora? Puede descargar la biblioteca Jakarta-ORO de código abierto desde Apache.org. El resto de este artículo primero presenta brevemente el conocimiento introductorio de las expresiones regulares y luego utiliza la API Jakarta-ORO como ejemplo para presentar cómo usar expresiones regulares.

1. Conocimientos básicos de expresiones regulares.

Empecemos con algo simple. Supongamos que desea buscar una cadena que contenga el carácter "cat". La expresión regular utilizada para la búsqueda es "cat". Si la búsqueda no distingue entre mayúsculas y minúsculas, las palabras "catálogo", "Catherine" y "sofisticado" coincidirán. Es decir:

1.1 Símbolo de punto

Supongamos que estás jugando al Scrabble y quieres encontrar palabras de tres letras, y estas palabras deben comenzar con la letra "t", terminando en la letra "n". Además, suponiendo que exista un diccionario de inglés, puede buscar todo su contenido utilizando expresiones regulares. Para construir esta expresión regular, puede utilizar un carácter comodín: el símbolo de punto "." Así, la expresión completa es "t.n", que coincide con "tan", "ten", "tin" y "ton", así como con "t#n", "tpn" e incluso "t n", entre muchas otras. Una combinación de significados. Esto se debe a que el símbolo de punto coincide con todos los caracteres, incluidos los espacios, los caracteres de tabulación e incluso las nuevas líneas:

1.2 Símbolo de corchete

Para resolver el problema de que la coincidencia del símbolo de punto sea demasiado amplia, Puede especificar caracteres significativos entre corchetes ("[]"). En este momento, solo los personajes especificados entre corchetes participan en la partida. Es decir, la expresión regular "t[aeio]n" sólo coincide con "tan", "Ten", "tin" y "ton". Pero "Toon" no coincide, porque sólo puedes hacer coincidir un único carácter dentro de los corchetes:

1.3 símbolo "o"

Si además de hacer coincidir todas las palabras anteriores , Si también desea hacer coincidir "toon", puede utilizar el operador "|". El significado básico del operador "|" es la operación "O". Para hacer coincidir "toon", utilice la expresión regular "t(a|e|i|o|oo)n". Las marcas de expansión cuadradas no se pueden usar aquí porque los corchetes solo permiten hacer coincidir un solo carácter; aquí se deben usar corchetes "()". Los paréntesis también se pueden utilizar para agrupar. Consulte la introducción a continuación para obtener más detalles.

1.4 Símbolos que representan el número de coincidencias

La Tabla 1 muestra los símbolos que representan el número de coincidencias. Estos símbolos se utilizan para determinar el número de apariciones del símbolo inmediatamente a la izquierda de. el símbolo:

Supongamos que queremos buscar en un archivo de texto los números de Seguro Social de EE. UU. El formato de este número es 999-99-9999. La expresión regular utilizada para coincidir se muestra en la Figura 1. En las expresiones regulares, el guión ("-") tiene un significado especial: representa un rango, por ejemplo de 0 a 9. Por lo tanto, cuando se hace coincidir un guión en un número de Seguro Social, va precedido de un carácter de escape "\".

Figura 1: Coincidencia de todos los números de seguridad social en el formato 123-12-1234

Supongamos que al realizar una búsqueda desea que aparezca o no el guión, es decir, 999- 99-9999 y 999999999 son ambos formatos correctos. En este momento, puede agregar el limitador de cantidad "?" después del guión, como se muestra en la Figura 2:

Figura 2: Haga coincidir todos los números de seguro social en el formato 123-12-1234 y 123121234

Veamos otro ejemplo. Un formato para las placas de automóviles estadounidenses es de cuatro números más dos letras. Su expresión regular está precedida por la parte numérica "[0-9]{4}", más la parte alfabética "[A-Z]{2}". La Figura 3 muestra la expresión regular completa.

Figura 3: Coincidencia de números de matrícula de automóviles típicos de EE. UU., como 8836KV

1.5 Símbolo "No"

El símbolo "^" se denomina "No" " símbolo. Si se usa entre corchetes, "^" indica un carácter que no se espera que coincida. Por ejemplo, la expresión regular de la Figura 4 coincide con todas las palabras excepto las que comienzan con la letra "X".

Figura 4: Relaciona todas las palabras excepto aquellas que comienzan con "X"

1.6 Paréntesis y símbolos de espacios en blanco

Supongamos que desea comenzar con el formato "26 de junio". , Extraiga la parte del mes de la fecha de cumpleaños de "1951". La expresión regular utilizada para hacer coincidir esta fecha se puede mostrar en la Figura 5:

Figura 5: Coincidencia de todas las fechas en formato Moth DD, AAAA

El nuevo símbolo "\s" es un símbolo de espacio en blanco, que coincide con todos los caracteres de espacio en blanco, incluido el carácter Tab. Si las cadenas coinciden correctamente, ¿cómo extraer la parte del mes a continuación? Simplemente cree un grupo colocando paréntesis alrededor del mes y extraiga su valor utilizando la API ORO (que se analiza en detalle más adelante en este artículo). La expresión regular modificada se muestra en la Figura 6:

Figura 6: Coincide con todas las fechas en formato Mes DD, AAAA y define el valor del mes como el primer grupo

1.7 Otros símbolos

Para simplificar, puede utilizar algunos símbolos de acceso directo creados para expresiones regulares comunes. Como se muestra en la Tabla 2:

Tabla 2: Símbolos comunes

Por ejemplo, en el ejemplo anterior de número de seguro social, podemos usar todos los lugares donde "[0-9] " aparece Utilice "\d". La expresión regular modificada se muestra en la Figura 7:

Figura 7: Coincide con todos los números de seguridad social en el formato 123-12-1234

2.

Hay muchas bibliotecas de expresiones regulares de código abierto disponibles para los programadores de Java, y muchas de ellas admiten la sintaxis de expresiones regulares compatible con Perl 5. Lo que elegí aquí es la biblioteca de expresiones regulares Jakarta-ORO, que es una de las API de expresiones regulares más completas y es totalmente compatible con las expresiones regulares de Perl 5. Además, también es una de las API mejor optimizadas.

La biblioteca Jakarta-ORO se llamaba anteriormente OROMatcher y Daniel Savarese la donó generosamente al Proyecto Jakarta. Puede descargarlo siguiendo las instrucciones al final de este artículo.

Primero daré una breve introducción a los objetos que debes crear y a los que debes acceder cuando uses la biblioteca Jakarta-ORO, y luego explicaré cómo usar la API Jakarta-ORO.

▲ Objeto PatternCompiler

Primero, cree una instancia de la clase Perl5Compiler y asígnela al objeto de interfaz PatternCompiler. Perl5Compiler es una implementación de la interfaz PatternCompiler que le permite compilar expresiones regulares en objetos Pattern para compararlas.

▲ Objeto Pattern

Para compilar una expresión regular en un objeto Pattern, llame al método compile() del objeto compilador y especifique la expresión regular en los parámetros de llamada.

Por ejemplo, podría compilar la expresión regular "t[aeio]n" de la siguiente manera:

De forma predeterminada, el compilador crea un patrón que distingue entre mayúsculas y minúsculas. Por lo tanto, el patrón compilado por el código anterior solo coincide con "tin", "tan", "ten" y "ton", pero no con "Tin" y "taN". Para crear un patrón que no distinga entre mayúsculas y minúsculas, debe especificar un parámetro adicional al llamar al compilador:

Después de crear el objeto Pattern, puede utilizar el objeto Pattern para realizar la coincidencia de patrones a través de la clase PatternMatcher.

▲ Objeto PatternMatcher

El objeto PatternMatcher realiza comprobaciones de coincidencia basadas en el objeto Pattern y la cadena. Crea una instancia de una clase Perl5Matcher y asigna el resultado a la interfaz PatternMatcher. La clase Perl5Matcher es una implementación de la interfaz PatternMatcher, que realiza la coincidencia de patrones de acuerdo con la sintaxis de expresión regular de Perl 5:

Al utilizar el objeto PatternMatcher, puede utilizar múltiples métodos para realizar operaciones de coincidencia. estos métodos son ¿Es la cadena que debe coincidir según la expresión regular?

· coincidencias booleanas (entrada de cadena, patrón de patrón): se utiliza cuando la cadena de entrada y la expresión regular deben coincidir exactamente. En otras palabras, la expresión regular debe describir completamente la cadena de entrada.

· booleanmatchesPrefix(Entrada de cadena, Patrón de patrón): Se utiliza cuando la expresión regular coincide con el comienzo de la cadena de entrada.

· booleano contiene (entrada de cadena, patrón de patrón): se utiliza cuando la expresión regular debe coincidir con parte de la cadena de entrada (es decir, debe ser una subcadena).

Además, en las tres llamadas a métodos anteriores, también puede usar el objeto PatternMatcherInput como parámetro en lugar del objeto String. En este momento, puede continuar haciendo coincidir desde la última posición coincidente en la cadena; Usar un objeto PatternMatcherInput como parámetro es útil cuando una cadena puede tener varias subcadenas que coinciden con una expresión regular determinada. Cuando se utiliza un objeto PatternMatcherInput como parámetro en lugar de String, la sintaxis de los tres métodos anteriores es la siguiente:

· coincidencias booleanas (entrada PatternMatcherInput, patrón de patrón)

· coincidencias booleanasPrefix (Entrada PatternMatcherInput, patrón Pattern)

· boolean contains(entrada PatternMatcherInput, patrón Pattern)

Ejemplos de aplicación

Echemos un vistazo a algunas aplicaciones. ejemplos de la biblioteca Yakarta-ORO.

3.1 Procesamiento de archivos de registro

Tarea: Analizar un archivo de registro del servidor web para determinar el tiempo que cada usuario pasa en el sitio web. En un archivo de registro típico de BEA WebLogic, el formato de registro es el siguiente:

Al analizar este registro, puede encontrar que hay dos elementos que se extraerán de este archivo de registro: dirección IP y tiempo de acceso a la página. . Puede utilizar símbolos de agrupación (paréntesis) para extraer direcciones IP y marcas de tiempo de los registros.

Primero echemos un vistazo a la dirección IP. La dirección IP consta de 4 bytes, cada byte tiene un valor entre 0 y 255 y cada byte está separado por un punto. Por tanto, cada byte de una dirección IP tiene al menos uno y como máximo tres dígitos.

La Figura 8 muestra la expresión regular escrita para la dirección IP:

Figura 8: Coincidencia de la dirección IP

El carácter de punto en la dirección IP debe estar precedido por "\ ") , porque el punto en la dirección IP tiene su significado original, en lugar de adoptar un significado especial en la sintaxis de la expresión regular. El significado especial de los puntos en las expresiones regulares se introdujo anteriormente en este artículo.

La parte de tiempo del registro de registro está rodeada por un par de corchetes. Puede extraer todo el contenido entre corchetes de la siguiente manera: primero busque el carácter de corchete inicial ("["), extraiga todo el contenido que no exceda el carácter de corchete final ("]") y busque hacia adelante hasta se encuentra el carácter de corchete. La Figura 9 muestra esta parte de la expresión regular.

Figura 9: Haga coincidir al menos un carácter hasta que se encuentre "]".

Ahora, agregue los símbolos de agrupación (paréntesis) a las dos expresiones regulares anteriores y combínelas en una sola expresión. , para que la dirección IP y la hora se puedan extraer de los registros. Tenga en cuenta que para hacer coincidir "- -" (pero no extraerlo), se agrega "\s-\s-\s" en el medio de la expresión regular. La expresión regular completa se muestra en la Figura 10.

Figura 10: Coincidencia de direcciones IP y marcas de tiempo

Ahora que se ha escrito la expresión regular, puede escribir código Java utilizando la biblioteca de expresiones regulares.

Para utilizar la biblioteca Jakarta-ORO, primero cree una cadena de expresión regular y una cadena de registro para analizarla:

La expresión regular utilizada aquí es la misma que la expresión regular de la Figura 10 Casi exactamente lo mismo, con una excepción: en Java, tienes que escapar de cada barra diagonal ("\"). La Figura 10 no es una representación de Java, por lo que debemos agregar un "\" delante de cada "\" para evitar errores de compilación. Desafortunadamente, el proceso de escape es propenso a errores, por lo que se debe tener cuidado. Primero puede ingresar la expresión regular sin escape y luego reemplazar cada "\" con "\\" de izquierda a derecha. Si desea volver a verificar, puede intentar enviarlo a la pantalla.

Después de inicializar la cadena, cree una instancia del objeto PatternCompiler y use PatternCompiler para compilar la expresión regular para crear un objeto Pattern:

Ahora, cree el objeto PatternMatcher y llame al método contiene(). de la interfaz PatternMatcher para verificar la situación de coincidencia:

A continuación, use el objeto MatchResult devuelto por la interfaz PatternMatcher para generar el grupo coincidente. Dado que la cadena logEntry contiene contenido coincidente, puede ver un resultado similar al siguiente:

3.2 Ejemplo 1 de procesamiento HTML

La siguiente tarea es analizar todas las etiquetas FONT en la propiedad de la página HTML . Una etiqueta FONT típica en una página HTML es la siguiente:

El programa generará los atributos de cada etiqueta FONT en la siguiente forma:

En este caso, le sugiero que utilice dos una expresión regular. El primero se muestra en la Figura 11, que extrae ""face="Arial, Serif" size="+2" color="red"" de la etiqueta de fuente.

Figura 11: Coincidencia de todos los atributos de la etiqueta FONT

La segunda expresión regular se muestra en la Figura 12, que divide cada atributo en pares nombre-valor

Figura 12: Coincidencia de un solo atributo y lo divide en. pares nombre-valor

El resultado de la división es:

Ahora echemos un vistazo al código Java para completar esta tarea. Primero, cree dos cadenas de expresiones regulares. Utilice Perl5Compiler para compilarlas. en objetos Pattern Al compilar la expresión regular, especifique la opción Perl5Compiler.CASE_INSENSITIVE_MASK para que la operación de coincidencia no distinga entre mayúsculas y minúsculas.

A continuación, cree un objeto Perl5Matcher que realice la operación de coincidencia. Supongamos que hay una variable html de tipo Cadena, que representa una línea de contenido en un archivo HTML.

El comparador devolverá verdadero si la cadena html contiene la etiqueta FONT. En este punto, puede utilizar el objeto MatchResult devuelto por el objeto coincidente para obtener el primer grupo, que contiene todas las propiedades de FONT:

A continuación, cree un objeto PatternMatcherInput. Este objeto le permite continuar la operación de coincidencia desde la última posición de coincidencia, por lo que es adecuado para extraer los pares de atributos nombre-valor dentro de la etiqueta FONT. Cree un objeto PatternMatcherInput y pase la cadena que debe coincidir en forma de parámetros. Luego, use la instancia de comparación para extraer los atributos de cada FUENTE. Esto se logra llamando repetidamente al método contiene() del objeto PatternMatcher, especificando un objeto PatternMatcherInput (en lugar de un objeto de cadena) como argumento. Cada iteración dentro del objeto PatternMatcherInput moverá su puntero interno hacia adelante y la siguiente detección comenzará detrás de la posición coincidente anterior.

Los resultados de este ejemplo son los siguientes:

3.3 Ejemplo 2 de procesamiento HTML

Echemos un vistazo a otro ejemplo de procesamiento HTML. Esta vez, asumimos que el servidor web se ha movido de widgets.acme.com a newserver.acme.com. Ahora desea modificar los enlaces en algunas páginas:

La expresión regular para realizar esta búsqueda se muestra en la Figura 13:

Figura 13: Coincidencia de los enlaces antes de la modificación

Si puede hacer coincidir esta expresión regular, puede reemplazar el enlace en la Figura 13 con el siguiente contenido:

Tenga en cuenta que se agrega $1 después del carácter #. La sintaxis de expresiones regulares de Perl utiliza $1, $2, etc. para representar los grupos coincidentes y extraídos. La expresión en la Figura 13 agrega todo el contenido coincidente y extraído como un grupo al final del enlace.

Ahora, volvamos a Java. Como hicimos antes, debes crear la cadena de prueba, crear los objetos necesarios para compilar la expresión regular en un objeto Pattern y crear un objeto PatternMatcher:

A continuación, usa com.oroinc Usa el sustituto() método estático de la clase Util en el paquete .text.regex para reemplazar y generar la cadena de resultado:

La sintaxis del método Util.substitute() es la siguiente:

El primeros dos términos de esta llamada Los primeros parámetros son los objetos PatternMatcher y Pattern creados previamente. El tercer parámetro es un objeto de sustitución, que determina cómo se realiza la operación de sustitución. Este ejemplo utiliza el objeto Perl5Substitution, que puede realizar sustituciones al estilo Perl5. El cuarto parámetro es la cadena que desea reemplazar y el último parámetro le permite especificar si desea reemplazar todas las subcadenas coincidentes del patrón (Util.SUBSTITUTE_ALL) o solo reemplazar un número específico de veces.

Conclusión En este artículo, le presenté el poder de las expresiones regulares. Siempre que se utilicen correctamente, las expresiones regulares pueden desempeñar un papel importante en la extracción de cadenas y la modificación de texto. Además, también presenté cómo utilizar expresiones regulares en programas Java a través de la biblioteca Jakarta-ORO. Depende de usted si termina usando el procesamiento de cadenas antiguo (usando StringTokenizer, charAt y substring) o usando expresiones regulares.