Colección de citas famosas - Colección de máximas - ¿Qué es una "expresión regular"?

¿Qué es una "expresión regular"?

Si alguna vez ha utilizado Perl o cualquier otro lenguaje con soporte integrado para expresiones regulares, sabrá lo fácil que es procesar texto y hacer coincidir patrones con expresiones regulares. Si no está familiarizado con el término, una "expresión regular" es una cadena que define un patrón 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 la funcionalidad avanzada de "búsqueda y reemplazo". ¿Qué pasa con Java? Al momento de escribir este artículo, se ha aprobado una solicitud de especificación de Java que cubre el procesamiento de texto utilizando expresiones regulares, y puede esperar verla en la próxima versión del JDK.

¿Pero qué pasa si ahora necesitas usar expresiones regulares? Puede descargar la biblioteca Jakarta-ORO de código abierto desde Apache.org. El siguiente contenido de este artículo presenta brevemente los conocimientos básicos 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

Hablemos primero de las simples. Supongamos que desea buscar una cadena que contenga el carácter "gato", la expresión regular utilizada para la búsqueda es "gato". Si la búsqueda no distingue entre mayúsculas y minúsculas, todas las palabras "catálogo", "Catherine" y "Sophie" coincidirán. Es decir:

1.1 Notación periódica

Supongamos que estás jugando al Scrabble y quieres encontrar palabras de tres letras que deben comenzar con la letra "T" y terminar con la letra ". NORTE". Además, supongamos que hay un diccionario de inglés y puedes buscar todo su contenido usando expresiones regulares. Para construir esta expresión regular, puede utilizar el carácter comodín: el símbolo de punto "." De esta forma, la expresión completa es "t.n", que coincide con "tan", "ten", "tin", "ton", así como con "t#n", "tpn" e incluso con "t n". como muchas otras combinaciones sin sentido. Esto se debe a que el símbolo de punto coincide con todos los caracteres, incluidos espacios, tabulaciones e incluso nuevas líneas:

1.2 Símbolo de corchete

Para resolver el problema de que el rango de coincidencia del símbolo de punto sea demasiado de ancho, puede especificar caracteres significativos entre corchetes ("[]"). En este momento, sólo 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 solo un carácter entre corchetes puede coincidir:

1.3 o símbolo

Si además de hacer coincidir todas las palabras anteriores, también deseas para que coincida con "toon" ", puede utilizar el operador "|". El significado básico de operador es u operación. Para hacer coincidir "toon", utilice la expresión regular "t(a|e|i|o|oo)n". Los símbolos de expansión cuadrada 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, como se describe más adelante.

1.4 Símbolo que representa el número de coincidencias.

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

Supongamos que queremos buscar en un texto Presente el número 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, al hacer coincidir guiones en números de Seguro Social, debe anteponerles un carácter de escape "\".

Figura 1: Haga coincidir todos los números de seguro social en el formulario 123-12-1234.

Supongamos que al realizar una búsqueda desea que el guión aparezca o no, es decir, 999-99-9999 y 9999999 están en el formato correcto. En este momento, puede agregar "?" después del guión. Símbolos de límite de cantidad, 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 121234.

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}" y la parte alfabética "[A-Z]{2}". La Figura 3 muestra la expresión regular completa.

Figura 3: Números coincidentes de matrículas de automóviles estadounidenses típicos, como 8836KV.

1.5 Sin firmar

El símbolo "" se llama símbolo "no". Si se usa entre corchetes, "" indica caracteres que no deben coincidir. 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 las que comienzan con "X"

1.6 Símbolos de corchetes y espacios en blanco

Supongamos que el mes se extrae de la parte de la fecha de cumpleaños , el formato es "26 de junio de 1951", la expresión regular utilizada para hacer coincidir esta fecha se puede mostrar en la Figura 5:

Figura 5: Coincide con todas las fechas en los formatos DD y AAAA.

El nuevo símbolo \s \ es un símbolo de espacio en blanco que coincide con todos los caracteres de espacio en blanco, incluidas las tabulaciones. Si las cadenas coinciden correctamente, ¿cómo extraigo la parte del mes a continuación? Simplemente agregue un paréntesis alrededor del mes para crear un grupo, luego use la API ORO (que se analiza en detalle más adelante en este artículo) para extraer su valor. 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 del número de seguro social, siempre que aparezca "[0-9]", podemos usado". 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.

En segundo lugar, la biblioteca Jakarta-ORO

Los programadores de Java pueden utilizar muchas bibliotecas de expresiones regulares de código abierto, muchas de las cuales admiten la sintaxis de expresiones regulares compatible con Perl 5. Elegí Yakarta aquí: la biblioteca de expresiones regulares ORO, una de las API de expresiones regulares más completas, que es totalmente compatible con las expresiones regulares de Perl 5. Además, es una de las API mejor optimizadas.

YAKARTA - La Biblioteca ORO, alguna vez conocida como OROMmatcher, fue donada generosamente por Daniel Savarese al Proyecto Yakarta. Puede descargarlo de acuerdo con las instrucciones en Recursos al final de este artículo.

Primero daré una breve introducción a los objetos que se deben crear y a los que se debe acceder cuando se usa la biblioteca Jakarta-ORO, y luego describiré cómo usar la API Jakarta-ORO.

▲objeto de compilación de patrones

Primero, cree una instancia de la clase del compilador perl 5 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 de patrón para compararlas.

▲Objeto de patrón

Para compilar una expresión regular en un objeto de patrón, llame al método compile() del objeto compilador y especifique la expresión regular en el parámetro de llamada. Por ejemplo, puede compilar la expresión regular "t[aeio]n" de la siguiente manera:

De forma predeterminada, el compilador crea patrones que distinguen 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 coincide 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 de patrón, puede usarlo para la coincidencia de patrones a través de la clase PatternMatcher.

▲ Objeto PatternMatcher

El objeto PatternMatcher realiza comprobaciones de coincidencia basadas en objetos de patrón y cadenas. Crea una instancia de una clase Perl5Matcher y asigna el resultado a la interfaz PatternMatcher.

La clase Perl 5Matcher es una implementación de la interfaz PatternMatcher, que realiza la coincidencia de patrones de acuerdo con la sintaxis de expresión regular de Perl5:

Al utilizar el objeto PatternMatcher, se pueden utilizar múltiples métodos para operaciones de coincidencia. El primer parámetro de estos métodos es la cadena que debe coincidir según la expresión regular:

Coincidencia booleana (entrada de cadena, modo 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.

Prefijo de coincidencia booleana (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 quiere 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 en lugar del objeto String como parámetro; 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 para reemplazar String, la sintaxis de los tres métodos anteriores es la siguiente:

Coincidencias booleanas (entrada de coincidencia de patrón, patrón de patrón)

Coincidencias booleanasPrefijo (entrada de coincidencia de patrón, patrón de patrón)

Booleano contiene (entrada de coincidencia de patrón, patrón de patrón)

3. Ejemplos de aplicación

Veamos algunos ejemplos de aplicación. de la biblioteca Yakarta-ORO.

3.1 Procesamiento del archivo de registro

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

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

Primero, echemos un vistazo a la dirección IP. Una 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 un bit y como máximo tres bits. La Figura 8 muestra la expresión regular escrita para direcciones IP:

Figura 8: Direcciones IP coincidentes

Los caracteres de punto en las direcciones IP deben estar separados por caracteres de escape (precedidos por "\"), porque el punto en la dirección IP tiene su significado original, no 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á encerrada entre corchetes. Puede extraer todo lo que está entre corchetes de la siguiente manera: primero busque el carácter del corchete inicial ("["), extraiga todo hasta el carácter del corchete de cierre inclusive ("]") y espere hasta encontrar el carácter del corchete de cierre. . 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, use símbolos de agrupación (paréntesis) para combinar las dos expresiones regulares anteriores en una sola expresión, de modo que IP Las direcciones y horas se pueden extraer de los registros. Tenga en cuenta que para hacer coincidir "-" (pero no extraer), 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 ha escrito la expresión regular, puede escribir código Java que utilice la biblioteca de expresiones regulares.

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

La expresión regular utilizada aquí es casi la misma que en la Figura 10. Las expresiones son exactamente iguales, con una excepción: en Java, cada barra inclinada (\") debe tener un carácter de escape. La Figura 10 no es una representación de Java, por lo que debemos poner un " delante de cada una para evitar errores de compilación ".