Datos (Programacion)
Datos (Programacion)
Huerta
DATOS
Datos son los hechos que describen sucesos y entidades."Datos" es una palabra en
plural que se refiere a más de un hecho. A un hecho simple se le denomina "data-
ítem" o elemento de dato.
Los datos son comunicados por varios tipos de símbolos tales como las letras del
alfabeto, números, movimientos de labios,
puntos y rayas, señales con la mano, dibujos, etc. Estos símbolos se pueden ordenar y
reordenar de forma utilizable y se les denomina información.
Los datos son símbolos que describen condiciones, hechos, situaciones o valores. Los
datos se caracterizan por no contener ninguna información. Un dato puede significar
un número, una letra, un signo ortográfico o cualquier símbolo que represente una
cantidad, una medida, una palabra o una descripción.
La importancia de los datos está en su capacidad de asociarse dentro de un contexto
para convertirse en información. Por si mismos los datos no tienen capacidad de
comunicar un significado y por tanto no pueden afectar el comportamiento de quien
los recibe. Para ser útiles, los datos deben convertirse en información para ofrecer un
significado, conocimiento, ideas o conclusiones.
El Concepto de Procesamiento de Datos
Hasta el momento hemos supuesto que los datos que maneja una aplicación no son
tan voluminosos y por lo tanto caben en memoria. Cuando recurrimos a archivos se
debe a la necesidad de conservar datos después de que termina un programa, por
ejemplo para apagar el computador.
Sin embargo, existen problemas en donde el volumen de datos es tan grande que es
imposible mantenerlos en memoria. Entonces, los datos se almacenan en un
conjunto de archivos, los que forman una base de datos. Una base de datos es por lo
tanto un conjunto de archivos que almacenan, por ejemplo, datos con respecto al
negocio de una empresa.
Cada archivo se forma en base a un conjunto de líneas y cada línea esta formada por
Programación Antonio G. Huerta
Recolección de datos:
Provee un vínculo para obtener la información interoperacionables racional y las
parametrizaciones.
Almacenamiento de datos:
Las unidades de disco de la computadora y otros medios de almacenamiento externo
permiten almacenar los datos a más largo plazo, manteniéndolos disponibles pero
separados del circuito principal hasta que el microprocesador los necesita. Una
computadora dispone también de otros tipos de almacenamiento.
La memoria de sólo lectura (ROM) es un medio permanente de almacenamiento de
información básica, como las instrucciones de inicio y los procedimientos de
entrada/salida. Asimismo, una computadora utiliza varios buffers (áreas reservadas
de la memoria) como zonas de almacenamiento temporal de información específica,
como por ejemplo los caracteres a enviar a la impresora o los caracteres leídos desde
el teclado.
Procesamiento de datos:
a. El objetivo es graficar el Procesamiento de Datos, elaborando un Diagrama
que permita identificar las Entradas, Archivos, Programas y Salidas de cada uno
de los Procesos.
b. Su antecedente es el Diagrama de Flujo.
c. Los elementos claves son los Programas.
d. Se confecciona el Diagrama de Procesamiento de Datos
e. Este Diagrama no se podrá elaborar por completo desde un primer momento
ya que depende del Flujo de Información.
f. En este primer paso sólo se identifican las Salidas y Programas. Los
elementos restantes se identifican en forma genérica.
Validación de datos:
Consiste en asegurar la veracidad e integridad de los datos que ingresan a un archivo.
Existen numerosas técnicas de validación tales como: Digito verificador, chequeo de
tipo, chequeo de rango.
Programación Antonio G. Huerta
Técnicamente, los datos son hechos y cifras en bruto, tales como órdenes y pagos, los
cuales se procesan para obtener información, por ejemplo el saldo deudor y el monto
disponible. Sin embargo, en el uso común, los términos datos e información se toman
como sinónimos.
La cantidad de datos versus información que se guarda en el computador constituye
una compensación. Los datos pueden procesarse en diferentes formas de
información, pero toma tiempo clasificar y sumar transacciones. La información
actualizada puede proporcionar respuestas inmediatas.
Un error frecuente es creer que el software es también datos. El computador ejecuta
o corre un software. Los datos se “procesan”, mientras que el software se “ejecuta”.
Tipos de datos
Un tipo de dato puede ser también visto como una limitación impuesta en la
interpretación de los datos en un sistema de tipificación, describiendo la
representación, interpretación y la estructura de los valores u objetos almacenados
Programación Antonio G. Huerta
Los fundamentales son: int, char, long int, float, double, long double.
- Tipos enumerados. Un tipo enumerado o enumeración está construido por una serie
de constantes simbólicas enteras. Los tipos enumerados se tratan de modo
ligeramente diferente en C++ que en ANSI C. El nombre de la etiqueta enum se
considera como un nombre de tipo igual que las etiquetas de struct y union. Por tanto
se puede declarar una variable de enumeración, estructura o union sin utilizar las
palabras enum, strcut o union.
C define el tipo de enum de tipo int. En C++, sin embargo, cada tipo enumerado es su
propio tipo independiente. Esto significa que C++ no permite que un valor int se
convierta automáticamente a un valor enum. Sin embargo, un valor enumerado se
puede utilizar en lugar de un int.
Ejemplo:
enum lugar{primero,segundo,tercero};
lugar pepe=primero; //correcto
int vencedor=pepe; //correcto
lugar juan=1; //incorrecto
Programación Antonio G. Huerta
- Tipos referencia. Las referencias son como alias. Son alternativas al nombre de un
objeto. Se define un tipo referencia haciéndole preceder por el operador de dirección
&. Un objeto referencia, igual que una constante debe ser inicializado.
int a=50;
int &refa=a; //correcto
int &ref2a; //incorrecto: no inicializado
El redondeo: Aproximar el valor real al entero más cercano (Ej: 3,8-->4 / 3,2--
>3)
El truncamiento: Eliminar del valor real la parte decimal (Ej: 3,8-->3 / 3,2-->3)
Programación Antonio G. Huerta
Otra operación importante que se puede realizar con número enteros es la operación
de módulo o resto de la división entera, es decir:
a mod b = c
c≥0
c<b
si c es igual a 0 --> a es múltiplo de b
si c es igual a 0 y b es igual a 2 --> a es par
El desbordamiento (overflow)
Un valor de tipo carácter es cualquier carácter que se encuentre dentro del conjunto
ASCII ampliado, el cual está formado por los 128 caracteres del ASCII más los 128
caracteres especiales que presenta, en este caso, IBM.
Que significa: "El valor ordinal de A es menor que el de a" o "A está antes que a"
La única operación (además de las relacionales) que podemos hacer con caracteres
es la concatenación concatenando dos caracteres, por ejemplo 'a' y 'X' obtendríamos
la cadena "aX".
Para generar un dato o valor lógico a partir de otros tipos de datos, típicamente, se
emplean los operadores relacionales (u operadores de relación), por ejemplo: 0 es
igual a falso y 1 es igual a verdadero
(3>2)= 1 = verdadero
(7>9)= 0 = falso
Una vez se dispone de uno o varios datos de tipo booleano, estos se pueden combinar
en expresiones lógicas mediante los operadores lógicos (AND, OR, NOT, ...). Un
ejemplo de este tipo de expresiones serían:
Ejemplos
0..9 — este tipo subrango consta de los elementos 0,1,2,3,4,5,6,7,8,9
Formato
type
Nombre = límite inferior .. límite superior
Ejemplo [editar]
{$R+} {Directiva de compilador R}
Program Positivos;
Uses Crt;
{El siguiente programa realiza una validación
para que sólo se acepten valores positivos
entre 0 y 32767 por medio de un tipo subrango}
Type
NumPositivo = 0..MaxInt;
Var
numero : NumPositivo;
Begin
ClrScr;
{numero:=-1; (está instrucción provocaría un error}
Write('Escribe un número entero positivo : ');
ReadLn(numero);
ReadKey
end.
Nota: Puesto que Turbo Pascal no siempre produce un error cuando el valor de
un tipo subrango está fuera de su rango definido. Sin embargo se puede tener
la posibilidad de visualizar dichos errores mediante la directiva de compilador:
{$R+} activada
{$R-} desactivada
Por defecto, está desactivada. Sólo se debe usar durante la fase de depuración.
En estos tipos de datos simples, se listan los identificadores que serán asociados con
cada valor a utilizar.
Programación Antonio G. Huerta
Ejemplo
Type
dias_semana =(lunes,martes,miércoles,jueves,
viernes,sabado,domingo);
colores_baraja =(espada,oro,basto,copa);
Var
días : dias_semana;
baraja : colores_baraja;
Formato
Type
nombre = (constante1,constante2,...,constanteN)
Los datos de tipo colores_baraja sólo podrán tomar los valores denotados por :
espada, oro, basto, copa . La posición de cada valor en la lista define su orden, por lo
que para el tipo dias_semana tenemos que :
Características
En el caso del valor máximo de un tipo enumerado, succ no está definido, y, para su
valor mínimo, no está definido pred.
La función estándar ord es aplicable a los argumentos que sean valores de tipo
enumerado. La relación biunívoca se da entre los valores del tipo y los enteros
comprendidos entre 0 y N-1, donde N es la cardinalidad del tipo enumerado.
Ejemplo
Program Dias_Semana;
Uses Crt;
{El siguiete programa muestra los días de
la semana por medio de tipos enumerados}
Type
Dia_Semana = (Lunes,Martes,Miércoles,Jueves,
Viernes,Sabado,Domingo);
Var
días :Dia_Semana;
i :byte;
Begin
ClrScr;
días:=lunes;
for i:=1 to 7 do
begin
case días of
Lunes :WriteLn('Lunes ');
Martes :WriteLn('Martes ');
Miércoles :WriteLn('Miércoles');
Jueves :WriteLn('Jueves ');
Viernes :WriteLn('Viernes ');
Sabado :WriteLn('Sabado ');
Domingo :WriteLn('Domingo ')
end;
días:=succ(días)
end;
ReadKey
end.
El tipo de dato real define un conjunto de números que pueden ser representados con
la notación de coma flotante.
Al igual que los números enteros, el tipo real está limitado superior e inferiormente
según la cantidad de memoria que haya disponible para almacenarlo. Otro elemento
importante a tener en cuenta en este tipo de datos es la precisión con que pueden
representar número con decimales (cuantos decimales se pueden representar), esta
característica también está directamente relacionada con la cantidad de memoria
disponible para almacenar un valor real.
A modo de ejemplo, en la tabla siguiente se muestran los rangos así como los
formatos de almacenamiento para los tipos reales fundamentales para un
determinado lenguaje de programación.
Programación Antonio G. Huerta
Cuando la precisión que admite un valor real es rebasada el valor de este trunca o se
redondea. Por ejemplo si el máximo número de dígitos decimales que puede albergar
un tipo real es 10 la siguiente operación:
a = 123,123456789 / 100
debería dar como resultado que a es igual a 1,23123456789, pero este valor tiene
11 decimales, por lo que el valor de a será uno de estos:
Truncando: a = 1,2312345678
Redondeando: a = 1,2312345679
Operaciones
Suma
Resta
Multiplicación
División
El desbordamiento (overflow)
Vector (informática)
Los vectores o arreglos (array en inglés) de dos o más dimensiones se denominan con
frecuencia matrices, y pueden tener tantas dimensiones como se desee; aunque para
evitar confusiones con el concepto matemático de matriz numérica (que
normalmente sólo tiene dos dimensiones), se suele utilizar el termino array (o
arreglo) para referirse de forma genérica a matrices de cualquier número de
dimensiones.
Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los
datos se realice de forma aleatoria e impredecible. Por el contrario, si los elementos
pueden estar ordenados y se va a utilizar acceso secuencial sería más adecuado
utilizar una lista, ya que esta estructura puede cambiar de tamaño fácilmente
durante la ejecución de un programa
Indexación base-cero (0): En este modo el primer elemento del vector será la
componente cero ('0') del mismo, es decir, tendrá el indice '0'. En
consecuencia, si el vector tiene 'n' componentes la última tendrá como índice
el valor 'n-1'. El C es un ejemplo típico de lenguaje que utiliza este modo de
indexación.
Notación Ejemplos
vector(índice_1,índice_2...,índice_N) (Basic)
vector{índice_1,índice_2...,índice_N} (Perl)
La forma de acceder a los elementos del array es directa; esto significa que el
elemento deseado es obtenido a partir de su índice y no hay que ir buscándolo
elemento por elemento (en contraposición, en el caso de una lista, para llegar, por
ejemplo, al tercer elemento hay que acceder a los dos anteriores o almacenar un
apuntador o puntero que permita acceder de manera rápida a ese elemento.
Para trabajar con vectores muchas veces es preciso recorrerlos. Esto se realiza por
medio de bucles. El siguiente pseudocódigo muestra un algoritmo típico para recorrer
un vector y aplicar una función 'f(...)' a cada una de las componentes del vector:
i=0
mientras (i < longitud)
#Se realiza alguna operación con el vector en la i-ésima posición
f(v[i])
i=i+1
fin_mientras
Programación Antonio G. Huerta
Vectores dinámicos
Lo habitual es que un vector tenga una cantidad fija de memoria asignada, aunque
dependiendo del tipo de vector y del lenguaje de programación un vector podría tener
una cantidad variable de datos. En este caso, se los denomina vectores dinámicos, en
oposición, a los vectores con una cantidad fija de memoria asignada se los denomina
vectores estáticos.
Ejemplos en C [editar]
int v[5];
int i;
for (i=0 ; i<5 ; i++)
{
v[i] = 2*i;
}
#include <vector>
El ejemplo anterior está hecho para el lenguaje C++. En C, para crear vectores
dinámicos se tendrían que utilizar las instrucciones malloc y realloc para reservar
memoria de forma dinámica (ver librería stdlib.h), y la función por free para liberar la
memoria utilizada.
Programación Antonio G. Huerta
Resultado:
0 1 2 3 4
0 2 4 6 8
Vectores multidimensionales
Por ejemplo el vector v(4,1) tiene 10 elementos se calcula del siguiente modo: (0-4) *
(0-1). Los elementos de la primera dimensión del vector contiene 5 elementos que
van del '0' al '4' y la 2º dimensión tiene 2 elementos que van desde '0' a '1'. Los
elementos serían accedidos del siguiente modo:
elemento 1: (0,0)
elemento 2: (0,1)
elemento 3: (1,0)
...
elemento 8: (3,1)
elemento 9: (4,0)
elemento 10: (4,1)
Cadena de caracteres
En matemáticas es habitual usar las letras w, x, y,... para referirnos a las cadenas. Por
ejemplo, si tenemos un alfabeto Σ = {a, b, c}, una cadena podría ser: x = aacbbcba.
Seguidas.
Enlazados letra a letra.
Representación
Una cadena suele ser representada entre comillas dobles superiores ("palabra"),
mientras que un carácter de esa cadena (un char en inglés) suele ser representado
entre comillas simples ('p'). Por ejemplo, en C:
char c = 'a';
char str[5] = "hola";
Programación Antonio G. Huerta
Para poder mostrar una comilla (") dentro de la cadena y no tener problemas con las
comillas que la delimitan, se usan secuencias de escape. Esto se aplica a otros
caracteres reservados o no imprimibles como el retorno de carro. No obstante, las
expresiones para producir estas secuencias de escape dependen del lenguaje de
programación que se esté usando. Una forma común, en muchos lenguajes, de
escapar un carácter es anteponiéndole un «\» (sin comillas), p. e.: «\"» (sin comillas).
Las cadenas pueden ser de naturaleza dinámica (pueden alterar su longitud durante
el tiempo de ejecución), o de naturaleza estática (su longitud es fija a lo largo del
tiempo de ejecución). En este segundo caso el programador debe prever que al
recorrer la cadena los indíces no se vayan de los límites previstos (C no permite que
las cadenas crezcan automáticamente de forma explíta, mientras que C# sí).
Estructura de datos
o El tipo cadena
o Estructurados
o Simples
Programación Antonio G. Huerta
o ordinales
Tipos simples
Como su nombre indica son los tipos básicos en Pascal. Son los más sencillos y los
más fáciles de aprender. Por todo esto, serán en los que nos centremos.
Los tipos simples más básicos son: entero, lógico, carácter y real. Y la mayoría de los
lenguajes de programación los soportan, no como ocurre con los estructurados que
pueden variar de un lenguaje a otro.
Tipos estructurados
Mientras que una variable de un tipo simple sólo referencia a un elemento, los
estructurados se refieren a colecciones de elementos.
Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy
variadas: tenemos colecciones ordenadas que se representan mediante el tipo array,
colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen
otros tipos, son los llamados registros.
Tipos ordinales
Dentro de los tipos simples, los ordinales son los más abundantes. De un tipo se dice
que es ordinal porque el conjunto de valores que representa se puede contar, es
decir, podemos establecer una relación uno a uno entre sus elementos y el conjunto
de los números naturales.
Realmente de los tipos simples tomamoslos más básicos, que son: integer, boolean,
char y real. Además, también se hablaras un poco de las cadenas de caracteres, los
llamados strings.
Programación Antonio G. Huerta
Controlar un bucle
Usarlas como contador, incrementando su valor cuando sucede algo
Realizar operaciones enteras, es decir, sin parte decimal
Y muchas más...
si/no
cierto/falso
funciona/no funciona
on/off
etc.
El tipo de datos real es el que se corresponde con los números reales. Este es un tipo
importante para los cálculos. Por ejemplo en los estadísticos, ya que se caracterizan
por tratar fundamentalmente con valores decimales.
nota: Aunque pueda que estés acostumbrado a escribir con coma los decimales, te
advierto que en Pascal y en todos los lenguajes de programación se escribe con un
punto. Por ejemplo: 3.1416
Sin embargo, con las cadenas de caracteres (strings) puedes contener en una sóla
variable más de un carácter. Por ejemplo, puedes tener en una variable tu nombre.
Identificadores
Son los nombres elegidos para las variables, constantes, funciones, clases y
similares. El primer carácter debe ser una letra o un subrayado. El resto del nombre
puede contener dígitos. Los identificadores que comienzan con dos subrayados están
reservados para uso interno del compilador C++.
Constantes
#!/usr/bin/perl
igual == eq
no igual != ne
Autoincremento y potencia:
#!/usr/bin/perl
#Escribimos en pantalla
print "Se contar:", $contador++ , ", ", $contador ++,"...\n";
Para concatenar cadenas tenemos el operador punto (.) y la función chop para quitar
el último caracter a una cadena.
Concatenar y chop:
#!/usr/bin/perl
#Escribimos en pantalla
print $cad3;
2.- Arrays
Un Array en Perl es como los de C, pero con la diferencia de que van precedidos del
símbolo arroba @. (como las variables de $). La forma de acceder a ellos es mediante
la indexación, contando desde cero. En Perl no nos tenemos que preocupar de
reservar la memoria ni gestionarla de ninguna forma. Hay que tener en cuenta que
cuando se accede a un elemento de un array, ya no se está haciendo referencia a un
array sino a un dato escalar, por lo que debe ir precedido del símbolo $. Vamos a
verlo con un ejemplo:
Ejemplo de Arrays:
#!/usr/bin/perl
Para sacar/insertar elementos se pueden usar las funciones pop y push. Que sacan o
insertan, respectivamente, un elemento al final, es decir, tratan el array como una
pila. También podemos utilizar shift y unshift para sacar o insertar, respectivamente,
un elemnto del principio del array.
#!/usr/bin/perl
En todo script de Perl existe el array @ARGV que contiene los parámetros de entrada.
#!/usr/bin/perl
Programación Antonio G. Huerta
my @array3D=([],[],[]);
$array2D[0][0]=0;
$array2D[0][1]=1;
$array2D[1][0]=2;
$array2D[1][1]=3;
$array3D[0][0][0]=20;
#!/usr/bin/perl
$colorfruta{"verde"}="kiwi";
$colorfruta{"amarillo"}="platano";
$colorfruta{"rojo"}="sandía";
$colorfruta{"naranja"}="naranja";
%dias=("lunes",L,"martes",M,"miercoles",X,"jueves",J,"viernes",V,"sabad
o",S,"domingo",D);
print "La representación del Martes es :". $dias{"martes"}." \n";
La función keys devuelve un array con las claves de un array asocitivo. La función
values devuelve un array con los valores de un array asocitivo. Con exits($hash{clave})
Programación Antonio G. Huerta
1 Operadores aritméticos
2 Operador de Concatenación
3 Condiciones de comparación
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 Condición lógica NOT
7 Condición lógica AND
8 Condición lógica OR
[Link]
Uso de Paréntesis
Cuando un operador combina dos expresiones de tipos de datos distintos, las reglas
de prioridad de tipo de datos especifican que el tipo de datos con la prioridad más
baja se convierta al tipo de datos con la prioridad más alta. Si la conversión no es una
conversión implícita admitida, se devuelve un error. Cuando ambas expresiones de
operandos tienen el mismo tipo de datos, el resultado de la operación tiene ese tipo
de datos.
SQL Server utiliza el siguiente orden de prioridad para los tipos de datos:
EXPRESIONES
[Link]ón
[Link] barra vertical separa las alternativas. Por ejemplo, "marrón|castaño" casa
con marrón o castaño.
[Link]ón
[Link] cuantificador tras un carácter especifica la frecuencia con la que éste
puede ocurrir. Los cuantificadores más comunes son +, ? y *:
35.+
[Link] signo más indica que el carácter al que sigue debe aparecer al menos una
vez. Por ejemplo, "ho+la" describe el conjunto infinito hola, hoola, hooola,
hoooola, etcétera.
37.?
[Link] signo de interrogación indica que el carácter al que sigue puede aparecer
como mucho una vez. Por ejemplo, "ob?scuro" casa con oscuro y obscuro.
39.*
[Link] asterisco indica que el carácter al que sigue puede aparecer cero, una, o
más veces. Por ejemplo, "0*42" casa con 42, 042, 0042, 00042, etcétera.
[Link]ón
[Link] paréntesis pueden usarse para definir el ámbito y precedencia de los
demás operadores. Por ejemplo, "(p|m)adre" es lo mismo que "padre|madre",
y "(des)?amor" casa con amor y con desamor.
[Link] constructores pueden combinarse libremente dentro de la misma
expresión, por lo que "H(ae?|ä)ndel" equivale a "H(a|ae|ä)ndel".
44. La sintaxis precisa de las expresiones regulares cambia según las
herramientas y aplicaciones consideradas, y se describe con más detalle a
continuación.
45. Su utilidad más obvia es la de describir un conjunto de cadenas, lo que resulta
de utilidad en editores de texto y aplicaciones para buscar y manipular textos.
Muchos lenguajes de programación admiten el uso de expresiones regulares
con este fin. Por ejemplo, Perl tiene un potente motor de expresiones
regulares directamente incluido en su sintaxis. Las herramientas
proporcionadas por las distribuciones de Unix (incluyendo el editor sed y el
filtro grep) fueron las primeras en popularizar el concepto de expresión regular.
Programación Antonio G. Huerta
En el área de la programación las expresiones regulares son un método por medio del
cual se pueden realizar búsquedas dentro de cadenas de caracteres. Sin importar si
la búsqueda requerida es de dos caracteres en una cadena de 10 o si es necesario
encontrar todas las apariciones de un patrón definido de caracteres en un archivo de
millones de caracteres, las expresiones regulares proporcionan una solución para el
problema. Adicionalmente, un uso derivado de la búsqueda de patrones es la
validación de un formato específico en una cadena de caracteres dada, como por
ejemplo fechas o identificadores.
Para poder utilizar las expresiones regulares al programar es necesario tener acceso
a un motor de búsqueda con la capacidad de utilizarlas. Es posible clasificar los
motores disponibles en dos tipos: Motores para el programador y Motores para el
usuario final.
Motores para el usuario final: son programas que permiten realizar búsquedas sobre
el contenido de un archivo o sobre un texto extraído y colocado en el programa. Están
diseñados para permitir al usuario realizar búsquedas avanzadas usando este
mecanismo, sin embargo es necesario aprender a redactar expresiones regulares
adecuadas para poder utilizarlos eficientemente. Éstos son algunos de los programas
disponibles:
Java: existen varias librerías hechas para java que permiten el uso de RegEx, y
Sun planea dar soporte a estas desde el SDK
JavaScript: a partir de la versión 1.2 (ie4+, ns4+) JavaScript tiene soporte
integrado para expresiones regulares.
Perl: es el lenguaje que hizo crecer a las expresiones regulares en el ámbito de
la programación hasta llegar a lo que son hoy en día.
Programación Antonio G. Huerta
PCRE: librería de ExReg para C, C++ y otros lenguajes que puedan utilizar
librerías dll (Visual Basic 6 por ejemplo).
PHP: tiene dos tipos diferentes de expresiones regulares disponibles para el
programador, aunque la variante POSIX (ereg) va a ser desechada en PHP 6.
Python: lenguaje de "scripting" popular con soporte a Expresiones Regulares.
.Net Framework: provee un conjunto de clases mediante las cuales es posible
utilizar expresiones regulares para hacer búsquedas, reemplazar cadenas y
validar patrones.
El Punto "."
\t — Representa un tabulador.
Programación Antonio G. Huerta
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 "este|oeste|
norte|sur" permitirá encontrar cualquiera de los nombres de los puntos cardinales. La
barra se utiliza comúnmente en conjunto con otros caracteres especiales.
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 letra minúscula. Cuando se utiliza en
conjunto con los corchetes 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.
De forma similar que los corchetes, los paréntesis sirven para agrupar caracteres, sin
embargo existen varias diferencias fundamentales entre los grupos establecidos por
medio de corchetes y los grupos establecidos por paréntesis:
El signo de pregunta tiene varias funciones dentro del lenguaje de las expresiones
regulares. La primera de ellas es especificar que una parte de la búsqueda es
opcional. Por ejemplo, la expresión regular "ob?scuridad" permite encontrar tanto
"oscuridad" como "obscuridad". En conjunto con los parentesis 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 referencia" 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 evitar 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".
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
claridad en la lectura de la expresión.
Nota: aunque esta forma de encontrar elementos repetidos es muy útil, algunas
veces no se conoce con claridad cuantas veces se repite lo que se busca o su grado
de repetición es variable. En estos casos los siguientes metacaracteres son útiles.
El asterisco "*"
El asterisco sirve para encontrar algo que se encuentra repetido 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
este por defecto trata de encontrar la mayor cantidad posible de caracteres que
correspondan con el patrón que se 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 dos paréntesis. Para obtener
el resultado deseado se debe utilizar el asterisco en conjunto con el signo de
pregunta de la siguiente forma: "\(.*?\)" Esto es equivalente a decirle al motor de
búsqueda que "Encuentre un paréntesis de apertura y luego encuentre cualquier
carácter repetido hasta que encuentre un paréntesis de cierre".
Se utiliza para encontrar una cadena que se encuentre repetida 1 o más veces. A
diferencia del asterisco, la expresión "[a-zA-Z]\d+" encontrará "H1" pero no
encontrará "H". También es posible utilizar este metacaracter en conjunto con el
signo de pregunta para limitar hasta donde se efectúa la repetición.
Programación Antonio G. Huerta
Grupos anónimos
Los grupos anónimos se establecen cada vez que se encierra una expresión regular
en paréntesis, por lo que la expresión "<([a-zA-Z]\w*?)>" define un grupo anónimo
que tendrá como resultado que el motor de búsqueda almacenará una referencia al
texto 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 referencia de la siguiente forma: "<([a-zA-
Z]\w*?)>.*?</\1>" Esta expresión regular encontrará tanto la cadena "Esta" como la
cadena "prueba" en el texto "Esta es una prueba" a pesar de que la expresión no
contiene los literales "font" y "B".
Para utilizar el motor de búsqueda del .Net Framework es necesario en primer lugar
hacer referencia al espacio de nombres [Link]. Luego es
necesario declarar una instancia de la clase Regex de la siguiente forma:
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:
Luego se puede utilizar la propiedad Groups de la clase Match para traer el resultado
de la búsqueda:
Grupos nominales
Los grupos nominales son aquellos a los que se les asigna un nombre, dentro de la
expresión regular para poder utilizarlos 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.
Es posible definir tantos grupos como sea necesario, 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:
"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?
<Value>[\w-:;,\./= \r\n]*?)'?"? ?)>"
Sin embargo, una etiqueta HTML puede tener más de un atributo. Este puede
resolverse utilizando repeticiones de la siguiente forma:
Programación Antonio G. Huerta
"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?
<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>"
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"]. Value;
foreach(Capture CurrentCapture in CurrentMatch. Groups["Attribute"]. Captures){
AttributesCollection. Add(CurrentCapture. Value)
}
foreach(Capture CurrentCapture 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]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?
<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>(?<Content>.*?)</\1>"