• No se han encontrado resultados

Los corchetes "[ ]"

In document Programación. (página 183-190)

79.4 Descripción de las expresiones regulares

79.4.4 Los corchetes "[ ]"

La función de los corchetes en el lenguaje de las expre- siones regulares es representar “clases de caracteres”, o sea, agrupar caracteres en grupos o clases. Son útiles cuando es necesario buscar uno de un grupo de caracte- res. Dentro de los corchetes es posible utilizar el guion "- " para especificar rangos de caracteres. Adicionalmente, losmetacaracterespierden su significado y se convierten en literales cuando se encuentran dentro de los corche- tes. Por ejemplo, como vimos en la entrega anterior "\d” nos es útil para buscar cualquier carácter que represente un dígito. Sin embargo esta denominación no incluye el punto ".”que divide la parte decimal de un número. Para buscar cualquier carácter que representa un dígito o un punto podemos utilizar la expresión regular "[\d.]". Co- mo se hizo notar anteriormente, dentro de los corchetes, el punto representa un carácter literal y no un metaca- rácter, por lo que no es necesario antecederlo con la ba- rra inversa. El único carácter que es necesario anteceder

con la barra inversa dentro de los corchetes es la propia barra inversa. La expresión regular "[\dA-Fa-f]" nos per- mite encontrar dígitos hexadecimales. Los corchetes nos permiten también encontrar palabras aún si están escri- tas de forma errónea, por ejemplo, la expresión regular “expresi[oó]n”permite encontrar en un texto la palabra “expresión”aunque se haya escrito con o sin tilde. Es necesario aclarar que sin importar cuantos caracteres se introduzcan dentro del grupo por medio de los corchetes, el grupo sólo le dice al motor de búsqueda que encuentre un solo carácter a la vez, es decir, que“expresi[oó]n”no encontrará “expresion”o “expresión”.

79.4.5 La barra "|"

Sirve para indicar una de varias opciones. Por ejemplo, la expresión regular “a|e”encontrará cualquier “a” o “e”dentro del texto. La expresión regular “es- te|oeste|norte|sur”permitirá encontrar cualquiera de los nombres de los puntos cardinales. La barra se utiliza co- múnmente en conjunto con otros caracteres especiales.

79.4.6 El signo de dólar "$"

Representa el final de la cadena de caracteres o el final de la línea, si se utiliza el modo multi-línea. No representa un carácter en especial sino una posición. Si se utiliza la expresión regular "\.$" el motor encontrará todos los lu- gares donde un punto finalice la línea, lo que es útil para avanzar entre párrafos.

79.4.7 El acento circunflejo "^"

Este carácter tiene una doble funcionalidad, que difiere cuando se utiliza individualmente y cuando se utiliza en conjunto con otros caracteres especiales. En primer lugar su funcionalidad como carácter individual: el carácter "^" representa el inicio de la cadena (de la misma forma que el signo de dólar "$" representa el final de la cadena). Por tanto, si se utiliza la expresión regular "^[a-z]" el motor encontrará todos los párrafos que den inicio con una le- tra minúscula. Cuando se utiliza en conjunto con los cor- chetes de la siguiente forma "[^\w ]" permite encontrar cualquier carácter que NO se encuentre dentro del grupo indicado. La expresión indicada permite encontrar, por ejemplo, cualquier carácter que no sea alfanumérico o un espacio, es decir, busca todos los símbolos de puntuación y demás caracteres especiales.

La utilización en conjunto de los caracteres especiales "^" y "$" permite realizar validaciones en forma sencilla. Por ejemplo "^\d$" permite asegurar que la cadena a verificar representa un único dígito "^\d\d/\d\d/\d\d\d\d$" permi- te validar una fecha en formato corto, aunque no permite verificar si es una fecha válida, ya que 99/99/9999 tam- bién sería válido en este formato; la validación completa

de una fecha también es posible mediante expresiones re- gulares, como se ejemplifica más adelante.

79.4.8

Los paréntesis "()"

De forma similar que los corchetes, los paréntesis sirven para agrupar caracteres, sin embargo existen varias dife- rencias fundamentales entre los grupos establecidos por medio de corchetes y los grupos establecidos por parén- tesis:

• Los caracteres especiales conservan su significado

dentro de los paréntesis.

• Los grupos establecidos con paréntesis establecen

una “etiqueta”o “punto de referencia”para el motor de búsqueda que puede ser utilizada poste- riormente como se denota más adelante.

• Utilizados en conjunto con la barra "|" permite ha-

cer búsquedas opcionales. Por ejemplo la expresión regular “al (este|oeste|norte|sur) de”permite bus- car textos que den indicaciones por medio de puntos cardinales, mientras que la expresión regular “es- te|oeste|norte|sur”encontraría“este”en la palabra “esteban”, no pudiendo cumplir con este propósito.

• Utilizados en conjunto con otros caracteres especia-

les que se detallan posteriormente, ofrece funciona- lidad adicional.

79.4.9

El signo de interrogación "?"

El signo de interrogación tiene varias funciones dentro del lenguaje de las expresiones regulares. La primera de ellas es especificar que una parte de la búsqueda es op- cional. Por ejemplo, la expresión regular “ob?scuridad” permite encontrar tanto “oscuridad”como “obscuri- dad”. En conjunto con los paréntesis redondos permite especificar que un conjunto mayor de caracteres es opcional; por ejemplo“Nov(\.|iembre|ember)?" permite encontrar tanto “Nov”como “Nov.”, “Noviembre” y “November”. Como se mencionó anteriormente, los paréntesis nos permiten establecer un “punto de refe- rencia”para el motor de búsqueda. Sin embargo, algunas veces, no se desea utilizarlos con este propósito, como en el ejemplo anterior “Nov(\.|iembre|ember)?". En este caso el establecimiento de este punto de referencia (que se detalla más adelante) representa una inversión inútil de recursos por parte del motor de búsqueda. Para evitarlo se puede utilizar el signo de pregunta de la siguiente forma: “Nov(?:\.|iembre|ember)?". Aunque el resultado obtenido será el mismo, el motor de búsqueda no realizará una inversión inútil de recursos en este grupo, sino que lo ignorará. Cuando no sea necesario reutilizar el grupo, es aconsejable utilizar este formato. De forma similar, es posible utilizar el signo de pregunta con otro significado: Los paréntesis

definen grupos “anónimos”, sin embargo el signo de pregunta en conjunto con los paréntesis triangulares "<>" permite “nombrar”estos grupos de la siguiente forma: "^(?<Día>\d\d)\/(?<Mes>\d\d)\/(?<Año>\d\d\d\d)$"; Con lo cual se le especifica al motor de búsqueda que los primeros dos dígitos encontrados llevarán la etiqueta “Día”, los segundos la etiqueta “Mes”y los últimos

cuatro dígitos llevarán la etiqueta “Año”.

NOTA: a pesar de la complejidad y flexibilidad dada por los caracteres especiales estudiados hasta ahora, en su mayoría nos permiten encontrar solamente un carácter a la vez, o un grupo de caracteres a la vez. Los meta- caracteres enumerados en adelante permiten establecer repeticiones.

79.4.10 Las llaves "{}"

Comúnmente las llaves son caracteres literales cuando se utilizan por separado en una expresión regular. Para que adquieran su función de metacaracteres es necesario que encierren uno o varios números separados por coma y que estén colocados a la derecha de otra expresión regular de la siguiente forma: "\d{2}" Esta expresión le dice al motor de búsqueda que encuentre dos dígitos contiguos. Utilizando esta fórmula podríamos convertir el ejemplo "^\d\d/\d\d/\d\d\d\d$" que servía para validar un formato de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor cla- ridad en la lectura de la expresión.

"\d{2,4}" Esta forma añade un segundo número separado por una coma, el cuál indica al motor de búsqueda que como máximo debe aparecer 4 veces la expresión regular \d. Los posibles valores son:

• "^\d\d$" (mínimo 2 repeticiones)

• "^\d\d\d$"(tiene 3 repeticiones, por lo tanto entra en

el rango 2-4)

• "^\d\d\d\d$" (máximo 4 repeticiones)

Nota: aunque esta forma de encontrar elementos repeti- dos es muy útil, algunas veces no se conoce con claridad cuantas veces se repite lo que se busca o su grado de re- petición es variable. En estos casos los siguientes meta- caracteres son útiles.

79.4.11 El asterisco "*"

El asterisco sirve para encontrar algo que se encuentra re- petido 0 o más veces. Por ejemplo, utilizando la expresión "[a-zA-Z]\d*" será posible encontrar tanto “H”como “H1”,“H01”,“H100”y“H1000”, es decir, una letra seguida de un número indefinido de dígitos. Es necesario tener cuidado con el comportamiento del asterisco, ya que éste, por defecto, trata de encontrar la mayor cantidad po- sible de caracteres que correspondan con el patrón que se

79.4. DESCRIPCIÓN DE LAS EXPRESIONES REGULARES 151 busca. De esta forma si se utiliza "\(.*\)" para encontrar

cualquier cadena que se encuentre entre paréntesis y se lo aplica sobre el texto“Ver (Fig. 1) y (Fig. 2)" se esperaría que el motor de búsqueda encuentre los textos "(Fig. 1)" y "(Fig. 2)", sin embargo, debido a esta característica, en su lugar encontrará el texto "(Fig. 1) y (Fig. 2)". Esto sucede porque el asterisco le dice al motor de búsqueda que llene todos los espacios posibles entre los dos paréntesis. Para obtener el resultado deseado se debe utilizar el asterisco en conjunto con el signo de interrogación de la siguien- te forma: "\(.*?\)" Esto es equivalente a decirle al motor de búsqueda que “Encuentre un paréntesis de apertura y luego encuentre cualquier secuencia de caracteres hasta que encuentre un paréntesis de cierre”.

79.4.12

El signo de suma "+"

Se utiliza para encontrar una cadena que se encuentre re- petida una o más veces. A diferencia del asterisco, la ex- presión "[a-zA-Z]\d+" encontrará“H1”pero no encon- trará “H”. También es posible utilizar este metacarác- ter en conjunto con el signo de interrogación para limitar hasta donde se efectúa la repetición.

79.4.13

Grupos anónimos

Los grupos anónimos se establecen cada vez que se en- cierra una expresión regular en paréntesis, por lo que la expresión "<([a-zA-Z]\w*?)>" define un grupo anónimo. El motor de búsqueda almacenará una referencia al grupo anónimo que corresponda a la expresión encerrada entre los paréntesis.

La forma más inmediata de utilizar los grupos que se definen, es dentro de la misma expresión regular, lo cual se realiza utilizando la barra inversa "\" seguida del número del grupo al que se desea hacer referen- cia de la siguiente forma: "<([a-zA-Z]\w*?)>.*?</\1>" Esta expresión regular encontrará tanto la cadena "<font>Esta</font>" como la cadena "<b>prueba</b>" en el texto "<font>Esta</font> es una <b>prueba</b>" a pesar de que la expresión no contiene los literales“font” y “B”.

Otra forma de utilizar los grupos es en el lenguaje de pro- gramación que se esté utilizando. Cada lenguaje tiene una forma distinta de acceder a los grupos. Los ejemplos enu- merados a continuación utilizan las clases del .Net Fra- mework, usando la sintáxis de C# (la cual puede fácil- mente adaptarse a VB .Net o cualquier otro lenguaje del Framework o incluso Java o JavaScript).

Para utilizar el motor de búsqueda del .Net Framework es necesario en primer lugar hacer referencia al espacio de nombres System.Text.RegularExpressions. Luego es necesario declarar una instancia de la clase Regex de la siguiente forma:

Regex _TagParser = new Regex("<([a-zA-Z]\w*?)>");

Luego asumiendo que el texto que se desea examinar con la expresión regular se encuentra en la variable “sText” podemos recorrer todas las instancias encontradas de la siguiente forma:

foreach(Match CurrentMatch in _TagPar- ser.Matches(sText)){ // --- Código extra aquí --- }

Luego se puede utilizar la propiedad Groups de la clase Match para traer el resultado de la búsqueda:

foreach(Match CurrentMatch in _TagPar- ser.Matches(sText)){ String sTagName = CurrentMatch. Groups[1].Value; }

Grupos nominales

Los grupos nominales son aquellos a los que se les asigna un nombre, dentro de la expresión regular para poder uti- lizarlos posteriormente. Esto se hace de forma diferente en los distintos motores de búsqueda, a continuación se explica como hacerlo en el motor del .Net Framework. Utilizando el ejemplo anterior es posible convertir "<([a- zA-Z]\w*?)>" en "<(?<TagName>[a-zA-Z]\w*?)>" Pa- ra encontrar etiquetasHTML. Nótese el signo de pregun- ta y el texto“TagName”encerrado entre paréntesis trian- gulares, seguido de éste. Para utilizar este ejemplo en el .Net Framework es posible utilizar el siguiente código: Regex _TagParser = new Regex("<(?<TagName>[a- zA-Z]\w*?)>"); foreach(Match CurrentMatch in _TagParser.Matches(sText)){ String sTagName = Cu- rrentMatch. Groups["TagName"]. Value; }

Es posible definir tantos grupos como sea nece- sario, de esta forma se puede definir algo como: "<(?<TagName>[a-zA-Z]\w*?) ?(?<Attributes>.*?)>" para encontrar no solo el nombre del tag HTML sino también sus atributos de la siguiente forma:

Regex _TagParser = new Regex("<(?<TagName>[a- zA-Z]\w*?) ?(?<Attributes>.*?)>"); foreach(Match CurrentMatch in _TagParser.Matches(sText)){ String sTagName = CurrentMatch. Groups["TagName"]. Value; String sAttributes = CurrentMatch. Groups["Attributes"]. Value; }

Pero es posible ir mucho más allá de la siguiente forma: "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribu- te>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)>"

Esta expresión permite encontrar el nombre de la etique- ta, el nombre del atributo y su valor.

atributo. Este puede resolverse utilizando repeticiones de la siguiente forma:

"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribu- te>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>"

Y en el código puede utilizarse de la siguiente forma: Regex _TagParser = new Regex("<?(?<TagName>[a- zA-Z][\w\r\n]*?)? (?:(?<Attribute>[\w-\r\n]*?)='?"? (?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>"); foreach(Match CurrentMatch in _TagParser.Matches(sText)){ String sTagName = CurrentMatch. Groups["TagName"]. Va- lue; foreach(Capture CurrentCapture in CurrentMatch. Groups["Attribute"]. Captures){ AttributesCollection. Add(CurrentCapture. Value) } foreach(Capture Current- Capture in CurrentMatch. Groups["value"]. Captures){ ValuesCollection. Add(CurrentCapture. Value) } } Es posible profundizar utilizando una expresión regular como esta:

"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribu- te>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>(?<Content>.*?)</\1>"

La cual permitiría encontrar el nombre de la etiqueta, sus atributos, valores y el contenido de esta, todo con una sola expresión regular.

79.5 Enlaces externos

Editor regex en línea(en inglés)

Tutorial Expresiones Regulares en Python (en in- glés)

Expresiones Regulares en Perl Manual sobre Expresiones Regulares

Portal de Información Expresiones Regulares en General(en inglés)

Capítulo 80

Flag

En programación, la bandera o flag se refiere a uno o másbitsque se utilizan para almacenar un valor binario o código que tiene asignado un significado. Las banderas normalmente forman parte de una determinada estructu- ra de datos, como un registro de una base de datos, y el significado del valor que figura en una bandera típicamen- te se definirá en relación a la estructura de datos de la que forma parte. En muchos casos el valor binario de la ban- dera se entenderá como la representación de uno de los posibles estados. En otras ocasiones, los valores binarios pueden representar uno o más atributos de un campo de bits, a menudo relacionados con habilidades o permisos, como “se puede escribir”o “puede ser borrado”. De todos modos, hay muchos otros posibles significados que pueden asignarse a los valores de la bandera. Un uso co- mún de las banderas es marcar o designar estructuras de datos para un posterior tratamiento.

Dentro de los microprocesadores y otros dispositivos lógicos, las banderas se utilizan mayoritariamente para controlar o indicar el estado intermedio o final o el re- sultado de diferentes operaciones. Por ejemplo, los mi- croprocesadores suelen tener unregistro de estadoque se compone de varias de estas banderas que se usarán para indicar varias condiciones establecidas como resultado de una operación, como podría ser hacer notar que ha habi- do undesbordamientoen una operación aritmética. Una vez establecidas, las banderas pueden utilizarse en ope- raciones posteriores como el control de flujo en una ope- ración de salto condicional. Por ejemplo, la instrucción enlenguaje ensamblador deIntel x86je (salta si igual)

comprobará el flag Z (cero) del registro de estado y si es- tá establecido (por una operación anterior) ejecutará un salto a la dirección indicada.

A los diferentes parámetros de control de una shell de línea de comandostambién se les suele llamar banderas. Estasshellsutilizan unanalizador sintácticopara traducir los parámetros pasados en banderas al uso de las vistas en este artículo.

80.1 Véase también

Registro de estado

Front-end y back-end

Front-end y back-end son términos que se refieren a la separación de interesesentre unacapa de presentacióny unacapa de acceso a datos, respectivamente. Pueden tra- ducirse al español el primero como interfaz, final fron-

tal o frontal y el segundo como motor, dorsal final*[1]o

zaga,*[2] aunque es común dejar estos términos en in-

glés.

81.1 Informática

Endiseño de softwareel front-end es la parte delsoftware

que interactúa con el o los usuarios y el back-end es la parte que procesa la entrada desde el front-end. La se- paración del sistema en front-ends y back-ends es un tipo deabstracciónque ayuda a mantener las diferentes partes del sistema separadas. La idea general es que el front-end sea el responsable de recolectar los datos de entrada del usuario, que pueden ser de muchas y variadas formas, y los transforma ajustándolos a las especificaciones que de- manda el back-end para poder procesarlos, devolviendo generalmente una respuesta que el front-end recibe y ex- pone al usuario de una forma entendible para este. La co- nexión del front-end y el back-end es un tipo deinterfaz. Endiseño web (o desarrollo web)hace referencia a la vi- sualización del usuario navegante por un lado (front-end), y del administrador del sitio con sus respectivos sistemas por el otro (back-end).

Muchos métodos conocidos para interactuar con ordena- dores pueden ser conceptualizados en términos de front-

end y back-end. Por ejemplo, unadministrador de archi- vosgráfico comoWindows Explorer,Dolphin,Nautilus

yFinderpuede ser considerado como un front-end para elsistema de archivosde la computadora. Otro ejemplo consiste en considerar alShellcomo front-end que sirve como interfaz para interactuar con el núcleo del sistema operativo que cumple el rol back-end.

En uncompiladorel front-end traslada el lenguaje del có- digo fuente a una representación intermedia que a su vez funciona con el back-end para producir en la salida el có- digo.

Ensintetizadores del habla, el front-end se refiere a la par- te del sistema que convierte la entrada del texto en una re-

presentaciónsimbólico-fonéticay el back-end convierte la representación fonética y simbólica en el sonido. Muchos programas tienen su concepto de diseño dividi- do en front-ends y back-ends, pero en la mayoría de los casos, el back-end está oculto del usuario final y solo pue- den utilizarlo el cliente intermedio o el administrador que se encargará de gestionar el sistema de información. Sin embargo, muchos programas están escritos para servir de simple front-end para otros que ya existen, como es el ca- so de las interfaces gráficas construidas sobre una interfaz delínea de órdenes. Este tipo de front-end es común en

entornos de escritorio Unix(como losGUI), donde los programas son desarrollados siguiendo lafilosofíade di- seño de muchos programas pequeños capaces de ejecutar-

se independientemente o combinados.

81.2 Tecnología

En radiotelescopios y antenas parabólicas, el front-end consiste en un paquete que contiene a laantena de bo- cinay a la guía de ondas, como un requisito para que las antenas detecten la señal de radio. El back end se refiere alamplificador y al filtro que refina y modifica laseñal

antes de presentarla al usuario.

En laautomatización de diseño electrónico, el ciclo del diseño, que es el front-end, equivale al diseño lógico y eléctrico (ej.captura esquemática,síntesis lógica). A ve- ces el boceto de una estructura (delinglés floorplanning), es considerado como un front-end. Un place and route

In document Programación. (página 183-190)