Encontrar lo que acertaron y otras funciones avanzadas

A veces, todo lo que usted necesita es saber es si de entrada de texto emparejado un patrón. Más comúnmente, desea seguir el proceso de datos específicos que se emparejaron. Por ejemplo, la esperanza de que los datos de su formulario web contiene un número válido de tarjeta de crédito - una secuencia de 13 a 16 dígitos. Usted simplemente no quieren verificar la ocurrencia de este patrón, lo que quisiera hacer es extraer la secuencia de dígitos que fue acompañado, por lo que se podría aplicar controles de verificación adicional. Las expresiones regulares permiten definir grupos de elementos del patrón, un modelo general puede, por ejemplo, tienen un poco de texto literal, un grupo con una secuencia de longitud variable de caracteres de alguna clase, el texto más literal, otra agrupación con diferentes personajes, y así sucesivamente. Si el patrón se corresponde, la expresión regular las funciones que corresponda almacenar los detalles del partido en general y las partes adaptado a cada uno de los grupos específicos. Estos datos se almacenan en las variables globales definidas en el núcleo de Perl. Los grupos de elementos del patrón, cuyos partidos de la cadena son necesarios, se colocan entre paréntesis. Por lo tanto, un modelo para la extracción de un 13-16 dígitos sub-cadena a partir de algunos cadena más larga podría ser / \ D (\ d (13,16)) \ d /, si una cadena coincide con este patrón, la variable $ 1 tendrá el dígito de cadena. El siguiente ejemplo ilustra la extracción de dos campos de una línea de entrada. La línea de entrada se supone que es un mensaje que contiene una cantidad de dólares. La cantidad en dólares se espera que consisten en un signo de dólar, un número de dígitos, un punto decimal opcional y una cantidad fracción opcional. El modelo utilizado para este partido es la siguiente:

/ \ $ ([0-9] +) \.? ([0-9] *) \ D /

Sus elementos son:

\ $ Signo de dólar literal ([0-9] +) en una secuencia no vacía de dígitos que forman el primer grupo \.? Un punto decimal opcional ([0-9] *) Una secuencia opcional de dígitos que forman el segundo grupo \ D Cualquier "no dígitos" carácter

El texto que coincide con el subgrupo paréntesis primero se celebró en la variable principal de Perl $ 1; el texto que coincide con el segundo grupo de dígitos se van en $ 2. Dado que la expresión segundo subgrupo especifica 'cero o más dígitos, es posible que los 2 dólares para celebrar una cadena vacía después de un partido con éxito. Las variables $ 1, $ 2, etc son de sólo lectura, los datos se deben copiar los valores de estas variables antes de que se puede cambiar.

while (1) (print "Ingrese cadena:", $ str =  If ($ str = ~ / Salir / i) (last;) if ($ str = ~ / \ $ ([0-9] +) \.? ([0-9] *) \ d /) (if ($ 2) ($ centavos = $ 2;) else ($ centavos = 0;) print "Dólares $ 1 y $ centavos centavos \ n";) else (print "no se corresponde con extractor de dólar \ n";))

Ejemplos de entradas de prueba y los resultados son los siguientes:

Ingrese cadena: Esto es una prueba de los US $ programa. No se corresponde con extractor de dólar Ingrese cadena: Este programa cuesta $ 0. Dólares 0 y centavos 0 Introducir cadena: Este programa cuesta $ 34.99 dólares y 34 centavos, 99 Ingrese cadena: QUIT
  

A menudo, se necesita un patrón como:

Algunos de texto fijos;

Una cadena cuyo valor es arbitrario, pero es necesario para la transformación;

Algunos textos más fijos.

Se utiliza .* para que coincida con una cadena arbitraria, de modo que si estuviera tratando de extraer de la sub-cadena entre las palabras 'fixed' y 'text', podría utilizar el patrón / fijo (.*) text /:

while (1) (print "Ingrese cadena:", $ str =  If ($ str = ~ / Salir / i) (last;) if ($ str = ~ / Fijo (.*) text /) (print "combinadas con la subcadena $ 1 \ n";) else (print "¿No coinciden \ n ";))

Ejemplo de entradas y salidas:

Ingrese cadena: arreglado el texto en la diapositiva. Emparejada con la subcadena Introduzca la cadena: arreglado el texto. Ahora, empezando a trabajar en otro texto. Subcadena emparejada con este texto. Ahora empieza a trabajar en otros

La equiparación de cadenas arbitrarias pueden a veces problemática. El algoritmo de coincidencia es «avaro» - que trata de encontrar la cadena más larga que los partidos. Hay controles más sutiles, se puede utilizar como patrones .*? que coinciden con una serie mínima (así en el segundo de los ejemplos anteriores, usted conseguiría el partido de 'este'). A veces, hay una necesidad de los patrones más complejos como:

fixed_text (somepattern) other_stuffSAMEPATTERNrest_of_line

Estos patrones se pueden definir mediante el uso de 'referencias' volver a la cadena de modelo. Referencias anteriores están relacionadas con la sub-emparejado strings.When Matcher el patrón es el patrón de control, se encuentra una coincidencia posible para el primer sub-cadena (el elemento '(somepattern)' en el ejemplo) y guarda este texto en la variable principal de Perl $ 1. Una referencia atrás, en la forma \ 1, que ocurre más adelante en el modelo de partido será sustituido de forma dinámica por este partido parcial salvo. El Matcher patrón puede confirmar que se repite el mismo patrón. Referencias anteriores se ilustran en los fragmentos de código siguiente. Estos fragmentos podrían formar parte de un script de Perl que fue a realizar una traducción aproximada de código Pascal a código C. Esta transformación no puede ser completamente automático (las lenguas tienen algunas diferencias fundamentales, como la capacidad de Pascal para anidar declaraciones de procedimiento), sin embargo, gran parte de la tarea de traducción se puede automatizar. Las operaciones de simple transformación que usted quiere son:

Count: = count + 1; => count + +; Count: = Count * Mul; => Count *= Mul; Suma: = Suma + 17; => Suma + = 17;

Para estos, necesita un patrón que:

Coincide con un nombre (valor-), esto es, que se ajustará sub-cadena $ 1.

Partidos de Pascal: = operador de asignación.

Partidos otro nombre que es idéntico a la primera acertaron, por lo que necesita de nuevo referencia \ 1 en el patrón.

Coincide con un Pascal +, -, *, / operador, esto es, que se ajustará subcadena $ 2.

Coincide con un número u otro nombre, partido de sub-cadena $ 3.

Partidos de Pascal terminador ';'.

Permite que los espacios en blanco extra en cualquier lugar.

Si una línea de entrada coincide con el patrón, el programa puede generar una línea de revisión que utiliza los operadores de asignación la modificación de C (+ +, + =, etc); entradas que no coinciden puede ser la producción sin cambios. Un marco pequeña prueba que ilustra transformaciones sólo para '+' y '-' los operadores es:

while (1) (print "Ingrese cadena:", $ str =  If ($ str = ~ / Salir / i) (last;) if ($ str bastante MATCH COMPLEJO DISEÑO!) (# Reemplace x: = x +1 por x + +, de manera similar x - if (($ 3 == 1 ) & & ($ 2 eq "+")) (print "\ t $ 1 + + \ n";) elsif (($ 3 == 1) & & ($ 2 eq "-")) (print "\ t $ 1 -; \ n ";) # Reemplace x: = x + y + por x = y, de manera similar para - else (print" \ t $ 1 $ 2 = $ 3; \ n ";)) else (print" $ cadena \ n ";))

El patrón necesita aquí es:

/ \ s * ([A-Za-z] \ w *) *: = * \ 1 * (\ + | \ * | \ / | -) * (([0-9 ]+)|([ A - Za-z] \ w *)) *, /)

Las partes son:

 s * cualquier número de espacios al principio o caracteres de tabulación.

([A-Za-z] \ w *) coincide con una cadena que comienza con una letra, entonces tiene un número arbitrario de letras, números y caracteres de subrayado (en caso de captura válida identificadores Pascal variable). Esto se corresponde subgrupo 1 dólar, su valor se hace referencia más adelante en el patrón a través de la referencia hacia atrás \ 1. Su valor puede ser usado en el código de procesamiento.

'*' Un espacio con cuantificador A * (cero o más), lo que coincide con los espacios que aparecen después del nombre de variable y antes de que el operador de asignación de Pascal: =.

: = Literal de cadena que coincide con el operador de asignación de Pascal.

'*' Otra vez, prever espacios adicionales.

\ 1, el patrón de referencia de la espalda. Necesarios para establecer que está trabajando en formas como la suma: = suma + val;.

'*' La disposición habitual de espacios adicionales.

(\ + | \ * \ \ / | -) Coincidan con un operador de Pascal binario. (Personajes como '+' tiene que ser "escapado", porque su interpretación normal es que los elementos de control en la definición de patrones.)

'*' Espacios posibles.

(([0-9 ]+)|([ A-Za-z] \ w *)) emparejado un sub-cadena que sea una secuencia de dígitos - [0-9] + - o un nombre de Pascal variable.

'*' Como de costumbre, los espacios.

; Separador de declaración Pascal expresiones regulares para la coincidencia de patrones complejos pueden llegar a ser bastante grandes. He escuchado, por correo electrónico, los rumores de una expresión de 4000 de caracteres que capta los elementos importantes de la dirección de correo electrónico, teniendo en cuenta para la mayoría de las variaciones en las formas de direcciones de correo electrónico!

Los programas que se transforma el texto elaborado, como una versión más ambiciosa del juguete 'Pascal al convertidor C', por lo general necesidad de aplicar muchas transformaciones diferentes a la misma línea de entrada. Por ejemplo, un Pascal, si ... Seguidamente, se ha reescrito en un estilo de C si (...).... Si la parte condicional de la declaración no implica un operador de Pascal, que debe ser reescrito en C's! operador. Programas de transformación de este tipo no simplemente leer una línea, aplicar una transformación y la producción de la línea de transformación. En su lugar, se aplican sucesivamente a la cadena in situ. Después de cada transformación, la cadena de actualización se compara con otros modelos posibles y sus reemplazos. Perl tiene un operador de sustitución que realiza estas transforma in situ de las cadenas. Un patrón consiste en la sustitución de una expresión regular que define las características de la cadena de origen y el texto de reemplazo. Los patrones y las sustituciones pueden incorporar emparejado sub-cadenas, así que es posible extraer una parte variable de texto incrustado en un contexto fijo y definir una sustitución en la que el texto variable se inserta en un contexto ligeramente cambiado. El imaginario "de Pascal a C transformador "es otro ejemplo. Habría que cambiar no de Pascal operador a C's! operador. Los casos comunes, que sería fácil de traducir, son:

Lvalue: = no de expresión; =>! Lvalue = expresión; si (no de expresión), entonces => if (expresión), entonces

Si la declaración tendría que ser sometido a nuevas transformaciones para sustituir el formulario si ... entonces por la C equivalente a construir. Un patrón de sustitución que podrían hacer estas transformaciones es el siguiente:

s /(:=| \ () * + no / \ 1 '/;

El patrón define:

Un subgrupo de que alguna de ellas contiene la secuencia literal: = o un paréntesis izquierdo (escapado como \ ().

Espacios Facultativo.

El no literal.

Uno o más espacios.

La sustitución es lo que el texto que coincidió el subgrupo (ya sea: = o paréntesis izquierdo), un espacio y C's! operador. Este patrón de sustitución se utilizará en el código como el siguiente:

while ($ str =  ) (Chomp ($ str); # Aplicar la secuencia de transformaciones a $ str ... # siguiente, con el operador no Pascal $ str = ~ s /(:=| \ () * + no / \ 1 '/;. .. print $ str, "\ n";)

Sus primeras aplicaciones de las expresiones regulares se utilizan sólo las formas más simples de los patrones. Sus tareas serán, después de todo, cosas simples como la extracción de una cantidad de dólares de parte del texto de entrada, el aislamiento de una dirección IP de un registro de servidor, o identificar qué compañía de tarjetas de crédito es preferible. Pero es posible, y es a menudo vale la pena, para tratar más sofisticados partidos y transforma. Usted puede recibir muchas ideas de los perlretut tutorial de Perl y perlre documentación de referencia.

un artículo presentado por Andrew Peterson


Descargo de responsabilidad:Nuestro sitio web no es responsable por el contenido de este artículo. Webarticles es un recurso de información gratuito.
Importante: Este artículo "Encontrar lo que acertaron y otras características avanzadas", fue traducida por un software automático. Sentimos pena por los errores de ortografía que pueda haber ocurrido. Gracias por su comprensión.


Online: 511 users browsing the articles directory