0% encontró este documento útil (0 votos)
473 vistas38 páginas

Datos (Programacion)

El documento habla sobre los conceptos de datos y tipos de datos en programación. Explica que un dato es una representación simbólica de una característica o atributo de una entidad y que por sí solo no tiene valor semántico, pero al ser procesado puede usarse para cálculos o toma de decisiones. También define los tipos de datos como conjuntos de valores con operaciones asociadas en lenguajes de programación. Finalmente, describe los procesos de recolección, almacenamiento, procesamiento y validación de datos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
473 vistas38 páginas

Datos (Programacion)

El documento habla sobre los conceptos de datos y tipos de datos en programación. Explica que un dato es una representación simbólica de una característica o atributo de una entidad y que por sí solo no tiene valor semántico, pero al ser procesado puede usarse para cálculos o toma de decisiones. También define los tipos de datos como conjuntos de valores con operaciones asociadas en lenguajes de programación. Finalmente, describe los procesos de recolección, almacenamiento, procesamiento y validación de datos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Programación Antonio G.

Huerta

DATOS

El dato (del latín datum), es una representación simbólica (numérica, alfabética,


algorítmica etc.), atributo o característica de una entidad. El dato no tiene valor
semántico (sentido) en sí mismo, pero convenientemente tratado (procesado) se
puede utilizar en la realización de cálculos o toma de decisiones. Es de empleo muy
común en el ámbito informático.

En programación un dato es la expresión general que describe las características de


las entidades sobre las cuales opera un algoritmo.

Un dato por sí mismo no constituye información, es el procesado de los datos lo que


nos proporciona información

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

campos de información. Todas las líneas de un mismo archivo tienen la misma


estructura, es decir los mismos campos de información. Diferentes archivos poseen
estructuras distintas, i.e. campos de información.
Por ejemplo, el archivo de postulantes [Link], visto en capítulos anteriores, tiene la
siguiente información:
 ci: carnet de identidad de la persona.
 nombre.

En lo que sigue supondremos que ambos archivos son lo suficientemente grandes


como para que no quepan en la memoria del computador. A continuación
resolveremos eficientemente el problema de generar un archivo con los tres campos
de información, sin colocar previamente el contenido de un archivo en un arreglo.

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”.

Cualquier forma de información, ya sea en forma electrónica o sobre papel. En forma


electrónica, “datos” se refiere a archivos, bases de datos, documentos de texto,
imágenes y, voz y video codificados en forma digital.

Tipos de datos

Concepto propio de la informática, más específicamente de los lenguajes de


programación, aunque también se encuentra relacionado con nociones similares de
las matemáticas y la lógica.

En lenguajes de programación un tipo de dato es un atributo de una parte de los


datos que indica al ordenador (y/o el programador) algo sobre la clase de datos sobre
los que se va a procesar. Esto incluye imponer restricciones en los datos, como qué
valores pueden tomar y qué operaciones se pueden realizar. Tipos de datos comunes
son: enteros, números de coma flotante (decimales), cadenas alfanuméricas, fechas,
horas, colores, coches o cualquier cosa que se nos ocurra. Por ejemplo, en Java, el
tipo "int" representa un conjunto de enteros de 32 bits cuyo rango va desde el
-[Link] al [Link], así como las operaciones que se pueden realizar
con los enteros, como la suma, resta y multiplicación. Los colores, por otra parte, se
representan como tres bytes denotando la cantidad de rojo, verde y azul, y una
cadena de caracteres representando el nombre del color; las operaciones permitidas
incluyen la adición y sustracción, pero no la multiplicación.

En un sentido amplio, un tipo de datos define un conjunto de valores y las


operaciones sobre estos valores. Casi todos los lenguajes de programación
explícitamente incluyen la notación del tipo de datos, aunque lenguajes diferentes
pueden usar terminología diferente. La mayor parte de los lenguajes de
programación permiten al programador definir tipos de datos adicionales,
normalmente combinando múltiples elementos de otros tipos y definiendo las
operaciones del nuevo tipo de dato. Por ejemplo, un programador puede crear un
nuevo tipo de dato llamado "Persona" que especifica que el dato interpretado como
Persona incluirá un nombre y una fecha de nacimiento.

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

en la memoria del ordenador. El sistema de tipificación usa información de los tipos


de datos para comprobar la verificación de los programas que acceden o manipulan
los datos.

Todos los datos en los ordenadores basados en la electrónica digital se representan


como bits (valores 0 y 1) en el nivel más bajo. La más pequeña unidad direccionable
de datos es un grupo de bits llamado un byte (normalmente un octeto, que son 8
bits). La unidad procesada por las instrucciones del código máquina se le llama una
palabra (en 2006, normalmente 32 o 64 bits). La mayor parte de las instrucciones
interpretan la palabra como un número binario, como por ejemplo una palabra de 32
bits puede representar valores enteros sin signo desde el 0 al 232 − 1 o valores
enteros con signo desde − 231 al 231 − 1. Por medio del complemento a dos, la mayor
parte del tiempo, el lenguaje máquina y la propia máquina no necesitan distinguir
entre tipos de datos con o sin signo.

Existe un específico conjunto de instrucciones aritméticas que usa una diferente


interpretación de los bits de una palabra como número en coma flotante.

C++, igual que C, contiene tipos fundamentales y tipos derivados o estructurados.

Los fundamentales son: int, char, long int, float, double, long double.

- Tipo vacío. El tipo vacío (void) se utiliza principalmente para especificar:


* Funciones que no devuelven valores.
* Punteros void, que referencian a objetos cuyo tipo es desconocido.

- 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

La última sentencia de asignación es aceptable en C pero no en C++, ya que 1 no es


un valor definido en lugar.

- 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

Todas las operaciones efectuadas sobre la referencia se realizan sobre el propio


objeto:
refa+=5; equivale a sumar 5 a a, que vale ahora 55
int *p=&refa; inicializa p con la dirección de a

Tipo de dato entero

Un tipo de dato entero en computación es un tipo de dato que puede representar un


subconjunto finito de los números enteros. El número mayor que puede representar
depende del tamaño del espacio usado por el dato y la posibilidad (o no) de
representar números negativos. Los tipos de dato entero disponibles y su tamaño
dependen del lenguaje de programación usado así como la arquitectura en cuestión.
Por ejemplo, si para almacenar un número entero disponemos de 4 bytes de
memoria tememos que:

4 Bytes = 4x8 = 32 bits


Con 32 bits se pueden representar 232=4294967296 valores:

 Sólo positivos: del 0 al 4294967295


 Positivos y negativos: del -2147483648 al 2147483647

Operaciones con enteros [editar]

Las típicas operaciones aritméticas: suma, resta, multiplicación y división se pueden


realizar con datos de tipo entero. En el caso de la división, el resultado podría ser un
valor real, en ese caso, si el resultado se ha de almacenar como entero la parte
decimal del resultado deberá ser eliminada, en principio hay dos métodos para
hacerlo:

 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:

184 dividido 3 = 61 (resto 1) --> 184 módulo 3 = 1

En general la operación módulo cumple que:

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)

Cuando operando con número enteros en un programa de ordenador ocurre que se


intenta asignar a un valor entero un valor que está fuera del rango de los valores que
se pueden representar (Ej: a=2 40) se produce un fallo que se conoce con el nombre de
desbordamiento (overflow en inglés). Cuando esto ocurre lo habitual es que el
programa siga funcionando como si nada hubiera pasado, pero el valor desbordado
se habrá convertido en un valor indeterminado con lo que las operaciones posteriores
en las que este valor intervenga producirán resultados incorrectos.

Tipo de dato carácter

Es cualquier signo tipográfico, puede ser una letra, un número, un signo de


puntuación o un espacio. Este término se usa mucho en computación.

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.

Los valores ordinales del código ASCII ampliado se encuentran en el rango de 0 a


255. Dichos valores pueden representarse escribiendo el carácter correspondiente
encerrado entre comillas simples (apóstrofos).

Así, podemos escribir:

'A' < 'a'

Que significa: "El valor ordinal de A es menor que el de a" o "A está antes que a"

Un valor de tipo carácter (char en inglés) se guarda en un byte de memoria.


Programación Antonio G. Huerta

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".

Tipo de dato lógico

El tipo de dato lógico o booleano es en computación aquel que puede representar


valores de lógica binaria, esto es, valores que representen falso o verdadero. Se
utiliza normalmente en la programación, estadística, electrónica, matemáticas
(Álgebra booleana), etc...

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:

 verdadero AND falso --> falso


 falso OR verdadero --> verdadero
 NOT verdadero --> falso

Tipo de dato subrango

El tipo de dato subrango es el más simple que se puede definir en un programa


Pascal. Estos tipos son útiles, sobre todo por la facilidad que ofrecen para verificar
automáticamente errores. Un tipo subrango se define de un tipo ordinal,
especificando dos constantes de ese tipo, que actúan como límite inferior y superior
del conjunto de datos de ese tipo. Un tipo subrango es un tipo ordinal y sus valores se
ordenan de igual modo que en el tipo patrón de que se deducen.
Programación Antonio G. Huerta

Ejemplos
0..9 — este tipo subrango consta de los elementos 0,1,2,3,4,5,6,7,8,9

1. '0'..'9' — este subrango consta de los caracteres '0','1','2','3','4','5','6','7','8', '9'


2. 'A'..'F' — este subrango consta de los caracteres 'A','B','C','D','E','F'

Se pueden crear variables cuyos valores se restrinjan a un subrango dado. Las


declaraciones de tipo subrango se sitúan entre las declaraciones de constantes y de
variables.

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.

Tipos enumerados [editar]

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);

De igual forma las variables pueden ser de tipo enumerado:

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 :

domingo > viernes da como resultado true


sabado < martes da como resultado false
jueves <> miércoles da como resultado true

Características

 Un tipo de dato enumerado es un tipo ordinal cuyo orden se indica por la


disposición de los valores en la definición.
 El número de orden de cada elemento comienza en 0 para el primer elemento.
 Las variables de tipo enumerado sólo pueden tomar valores de estos tipos.
 Los únicos operadores que pueden acompañar a los tipos ordinales son los
operadores de relación y asignación.
 A los valores de los tipos enumerados se les pueden aplicar las funciones
estándar succ (de sucesor), pred (de predecesor) y ord (de ordinal).

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.

El tipo estándar boolean es equivalente a un tipo enumerado de la forma :

boolean = ( false, true);


Programación Antonio G. Huerta

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.

Tipo de dato real

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

Tipos reales fundamentales en Pascal:

Tipo Rango Dígitos Tamaño


significativos en bytes
---------------------------------------------------------------------------------
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11 – 12 6
Single 1.5 x 10^–45 .. 3.4 x 10^38 7– 8 4
Double 5.0 x 10^–324 .. 1.7 x 10^308 15 – 16 8
Extended 3.6 x 10^–4951 .. 1.1 x 10^4932 19 – 20 10
Comp –2^63+1 .. 2^63 –1 19 – 20 8
Currency –922337203685477.5808 .. 922337203685477.5807 19 – 20
8

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

Las típicas operaciones aritméticas:

 Suma
 Resta
 Multiplicación
 División

El desbordamiento (overflow)

Cuando operando con número reales en un programa de ordenador ocurre que se


intenta asignar a una variable un valor que está fuera del rango de los valores que se
pueden representar se produce un fallo que se conoce con el nombre de
desbordamiento (overflow en inglés). Cuando esto ocurre lo habitual es que el
programa siga funcionando como si nada hubiera pasado, pero el valor desbordado
se habrá convertido en un valor indeterminado con lo que las operaciones posteriores
en las que este valor intervenga producirán resultados incorrectos.
Programación Antonio G. Huerta

Vector (informática)

Arreglo unidimensional con 10 elementos

En programación, un array es un conjunto o agrupación de variables del mismo tipo


cuyo acceso se realiza por índices.

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.

Desde el punto de vista de un programa de ordenador, un array (matriz o vector) es


una zona de almacenamiento contiguo, que contiene una serie de elementos del
mismo tipo, los elementos de la matriz. Desde el punto de vista lógico un array se
puede ver como un conjunto de elementos ordenados en fila (o filas y columnas si
tuviera dos dimensiones). En principio, se puede considerar que todos los arrays son
de una dimensión, la dimensión principal, pero los elementos de dicha fila pueden ser
a su vez arrays (un proceso que puede ser recursivo), lo que nos permite hablar de la
existencia de arrays multidimensionales, aunque los más fáciles de "mondaa" o
imaginar son los de una, dos y tres 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

Todo vector se compone de un determinado número de elementos. Cada elemento es


referenciado por la posición que ocupa dentro del vector. Dichas posiciones son
llamadas índice y siempre son correlativos. Existen tres formas de indexar los
elementos de un array:

 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.

 Indexación base-uno (1): En esta forma de indexación, el primer elemento del


array tiene el indice '1' y el último tiene el índice 'n' (para un array de 'n'
componentes).
Programación Antonio G. Huerta

 Indexación base-n (n): Este es un modo versátil de indexación en la que el


índice del primer elemento puede ser elegido libremente, en algunos
lenguajes de programación se permite que los índices puedan ser negativos e
incluso de cualquier tipo escalar (también cadenas de caracteres).

La representación de un elemento en un vector se suele hacer mediante el


identificador del vector seguido del índice entre corchetes, paréntesis o llaves:

Notación Ejemplos

vector[índice_1,índice_2...,índice_N] (Java, Lexico, etc.)

vector[índice_1][índice_2]...[índice_N] (C, C++, PHP, etc.)

vector(índice_1,índice_2...,índice_N) (Basic)

vector{índice_1,índice_2...,índice_N} (Perl)

Aunque muchas veces en pseudocódigo y en libros de matemática se representan


como letras acompañadas de un subíndice numérico que indica la posición a la que
se quiere acceder. Por ejemplo, para un vector "A":

A0,A1,A2,... (vector unidimensional)


Forma de Acceso

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.

El uso de vectores dinámicos requiere realizar una apropiada gestión de memoria


dinámica. Un uso incorrecto de los vectores dinámicos, o mejor dicho, una mala
gestión de la memoria dinámica, puede conducir a una fuga de memoria. Al utilizar
vectores dinámicos siempre habrá que liberar la memoria utilizada cuando ésta ya no
se vaya a seguir utilizando.

Lenguajes más modernos y de más alto nivel, cuentan con un mecanismo


denominado recolector de basura (como es el caso de Java) que permiten que el
programa decida si debe liberar el espacio basándose en si se va a utilizar en el
futuro o no un determinado objeto.

Ejemplos en C [editar]

 Declaración en C (o C++) de un vector estático.- La forma de crear vectores


estáticos es igual que en C y C++.

int v[5];
int i;
for (i=0 ; i<5 ; i++)
{
v[i] = 2*i;
}

 Declaración en C++ de un vector dinámico:

#include <vector>

vector<int> v; // Si no se especifica el tamaño inicial es 0

for (int i=0 ; i<5 ; i++)


{
v.push_back(2*i); // inserta un elemento al final del 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

El resultado de los dos ejemplos es el mismo vector

Vectores multidimensionales

En Basic, Java y otros lenguajes es posible declarar matrices multidimensionales,


entendiéndolas como un vector de vectores. En dichos casos en número de
elementos del vector es el producto resultante de cada dimensión.

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 o en programación, una cadena de caracteres, palabra, ristra de


caracteres o frase (string en inglés) es una secuencia ordenada de longitud arbitraria
(aunque finita) de elementos que pertenecen a un cierto alfabeto. En general, una
cadena de caracteres es una sucesión de caracteres (letras, números u otros signos o
símbolos).
Programación Antonio G. Huerta

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.

Desde un punto de vista de la programación, si no se ponen restricciones al alfabeto,


una cadena podrá estar formada por cualquier combinación finita de todo el juego
caracteres disponibles (las letras de la 'a' a la 'z' y de la 'A' a la 'Z', los números del '0'
al '9', el espacio en blanco ' ', símbolos diversos '!', '@', '%', etc). En este mismo
ámbito (el de la programación), se utilizan normalmente como un tipo de dato
predefinido, para palabras, frases o cualquier otra sucesión de caracteres. En este
caso, se almacenan en un vector de datos, o matriz de datos de una sola fila (array en
inglés). Las cadenas se pueden almacenar físicamente:

 Seguidas.
 Enlazados letra a letra.

Generalmente son guardados un carácter a continuación de otro por una cuestión de


eficiencia de acceso.

Un caso especial de cadena es la que contiene cero caracteres, a esta cadena se la


llama cadena vacía.

Siguiendo en el ámbito de la informática, al considerar las cadenas como un tipo de


datos, hay que definir (o conocer) cuales son las operaciones que podemos hacer con
ellas, en principio éstas podrían ser muchas y llegar a ser muy sofisticadas, aquí se
exponen algunas de ellas:

 Asignación: Consiste en asignarle una cadena a otra.


 Concatenación: Consiste en unir dos cadenas o más (o una cadena con un
carácter) para formar una cadena de mayor tamaño.
 Búsqueda: Consiste en localizar dentro de una cadena una subcadena más
pequeña o un carácter.
 Extracción: Se trata de sacar fuera de una cadena una porción de la misma
según su posición dentro de ella.
 Comparación: Se utiliza para comparar dos cadenas.

(Operaciones con cadenas en el lenguaje C)

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

Generalmente para acceder a un carácter en una posición determinada se suele usar


la forma variable[posición] como cuando se accede a un vector.

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).

Cadenas dinámicas y estáticas

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í).

El final de la cadena se delimita de diferente manera en uno u otro caso:

 Mediante un carácter de fin de cadena ("\0" en C) para las cadenas de tipo


dinámico.
 Mediante una propiedad de la cadena que delimite su longitud (Length en C#)
para las de tipo estático.

Ejemplos de algunas operaciones comunes

Asignación: asignarle una cadena a otra

char *strcpy(char [], const char[]); # en C


cadena1=cadena2; # en C++

Concatenación: unir dos cadenas de caracteres.

$pareja = "Joshua"." y "."Lidia" # en Perl y PHP;


pareja = "Luisa" & " y " & "Carmen" # en Visual Basic;
pareja = "Luisa" + " y " + "Carmen"; # en C++ y Java con la clase String.
strcat(cadena1,cadena2); strcat(cadena1, cadena3); # en C (Debe haber suficiente
espacio en la primera)

Nº de caracteres de una cadena

int strlen(const char[]); # en C Devuelve el nº de caracteres sin contar el '\0'


[Link](); # en C++

Comparación: Compara dos cadenas en orden lexicográfico


Programación Antonio G. Huerta

int strcmp(const char[], const char[]); # en C Devuelvee <0 si la 1ª es menor, >0 si es


mayor y 0 si son iguales
cadena1==cadena2; cadena1>cadena2; etc. # en C++ Devuelve un valor de verdad

Multiplicar una cadena: repetir una cadena un número de veces

$puntos ="." x 5 # pone 5 puntos en Perl

Estructura de datos

En programación, una estructura de datos es una forma de organizar un conjunto de


datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es
la mínima información que se tiene en un sistema.

Una estructura de datos define la organización e interrelación de éstos y un conjunto


de operaciones que se pueden realizar sobre ellos. Las operaciones básicas son:

 Alta, adicionar un nuevo valor a la estructura.


 Baja, borrar un valor de la estructura.
 Búsqueda, encontrar un determinado valor en la estructura para realizar una
operación con este valor, en forma SECUENCIAL o BINARIO (siempre y cuando
los datos estén ordenados)...

Otras operaciones que se pueden realizar son:

 Ordenamiento, de los elementos pertenecientes a la estructura.


 Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a
las apareadas.

Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia


para la realización de cada operación. De esta forma, la elección de la estructura de
datos apropiada para cada problema depende de factores como la frecuencia y el
orden en que se realiza cada operación sobre los datos.

Clasificaciones en los tipos de datos

sólo se trataran los básicos para ir construyendo los primeros programas.

Existen muchas clasificaciones para los tipos de datos, y dependiendo de la fuente


que se mire, mostrarán una u otra. A continuación tienes una de las posibles
clasificaciones.:

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.

Dentro de los tipos simples ordinales, los más importantes son:

 El tipo entero (integer)


 El tipo lógico (boolean)
 El tipo carácter (char)

Los tipos básicos

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

nota: a continuación sólo se comentará qué es cada tipo, no se explicará su


declaración, esto puedes verlo si vas a la sección correspondiente.

El tipo integer (entero)


Como ya habrás leído el tipo de datos entero es un tipo simple, y dentro de estos, es
ordinal. Al declarar una variable de tipo entero, estás creando una variable numérica
que puede tomar valores positivos o negativos, y sin parte decimal.

Este tipo de variables, puedes utilizarlas en asignaciones, comparaciones,


expresiones aritméticas, etc. Algunos de los papeles más comunes que desarrollan
son:

 Controlar un bucle
 Usarlas como contador, incrementando su valor cuando sucede algo
 Realizar operaciones enteras, es decir, sin parte decimal
 Y muchas más...

El tipo boolean (lógico)


El tipo de datos lógico es el que te permite usar variables que disponen sólo de dos
posibles valores: cierto o falso. Debido a esto, su utilidad salta a la vista, y no es otra
que variables de chequeo. Nos sirven para mantener el estado de un objeto mediante
dos valores:

 si/no
 cierto/falso
 funciona/no funciona
 on/off
 etc.

El tipo real (real)


Como ya he visto, Pascal soporta el conjunto entero de números. Pero no es el único,
también te permite trabajar con números pertenecientes al conjunto real.

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

Los tipos char y string (carácter y cadena)


Con el tipo carácter puedes tener objetos que representen una letra, un número, etc.
Es decir, puedes usar variables o constantes que representen un valor alfanumérico.
Pero ojo, cada variable sólo podrá almacenar un carácter.
Programación Antonio G. Huerta

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

C++ permite utilizar varios tipos de constantes:


1. Constantes enteras 44 0 -345
2. Constantes enteras muy grandes. Se identifican situando una L al final de la
constante entera 33L -105L
3. Constantes octales o hexadecimales. Un 0 a la izquierda indica una constante octal
y un 0x o bien 0X indican una constante hexadecimal 0 02 077 0123 equivalen a 0 2
63 83 en octal 0x0 0x2 0x3F 0x53 equivalen a 0 2 63 83 en hexadecimal
4. Constantes reales (coma flotante) 0.0 3.1416 -99.2 C++ permite especificar
constante de coma flotante de simple precisión (sufijo f o F) y doble precisión larga
(sufijo l o L). 32.0f 3.1416L
5. Constantes carácter 'z' '5'
6. Constantes cadena "hola" "hoy es lunes"

Operadores de datos escalares

El operador de asignación se utiliza, igual que en C, el símbolo =, como se puede


obervar en el primer ejemplo de la página. También se pueden mezclar operadores
ariméticos junto con la asignación.

Asignación y operadores aritméticos:

#!/usr/bin/perl

#Asigno valores a variables


my $uno=123.67;
$dos=123123.2334;
$suma=$uno;
$suma+=$dos;

#Escribimos resultados en pantalla


print "La suma de $uno y $dos es = $suma \n";

Los operadores de comparación, son similares a los de C, pero depende si estamos


comparando cadenas o datos numéricos. Los operadores para números y para
cadenas son:
Programación Antonio G. Huerta

Comparación Números Cadenas

igual == eq

no igual != ne

menor que < lt

mayor que > gt

menor o igual que <= le

mayor o igual que >= ge

En Perl también tenemos los operadores de autoincremento (++)y autodecremento


(--). Y además tenemos el operador potencia **(que es muy parecido aunque muy
diferente)

Autoincremento y potencia:

#!/usr/bin/perl

#Asigno valores a variables


my $contador=0;

#Escribimos en pantalla
print "Se contar:", $contador++ , ", ", $contador ++,"...\n";

print "2 elevado a $contador es:", (2**$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

#Asigno valores a variables


my $cad1="Hola";
my $cad2="Mundo";
my $cad3=$cad1." ".$cad2;

#Metemos una nueva línea y un caracter raro en $cad3


$cad3=$cad3."\n=";
Programación Antonio G. Huerta

#Y le quitamos el caracter raro


chop($cad3);

#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

#Declaramos la variable primer_array como un array


my @primer_array;

#asignamos unos cuatro valores al array


@primer_array=(1,"dos",3,"cuatro");

#Añadimos un quinto de forma individual


$primer_array[4]=5.5;

#Mostramos el tercer elemento del array


print "El tercero es= ".$primer_array[3]." \n";

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.

Para ver el tamaño (número de elementos) de un array se utiliza el símbolo de


sostenido (#) entre el símbolo $ y el nombre del array, es decir, con $#array. Este
tamaño nos lo da contando desde 0 o, lo que es lo mismo, realmente nos da el último
índice que existe en el array. Si el array no tuviese ningún elemento, su tamaño sería

Programación Antonio G. Huerta

Ejemplo de pop/push, shift/unshift, y tamaño del array:

#!/usr/bin/perl

#asignamos unos cuatro valores al array


@matriz=(1,"dos",3,"cuatro");

#Añadimos con Push


push(@matriz, 5, 6, "siete");

#Mostramos el último elemento


print "El último es ". $matriz[$#matriz]."\n";

#sacamos con Pop


$uno=pop(@matriz);

print "He sacado $uno\n";

#Añadimos con unshift


unshift(@matriz, "cero", -1 );

#Mostramos el primer elemento


print "El primero es ". $matriz[0]."\n";

#sacamos con shift


$uno=shift(@matriz);

print "He sacado $uno\n";

print "La matriz tiene ".$#matriz." elementos\n";

En todo script de Perl existe el array @ARGV que contiene los parámetros de entrada.

Para añadir dimensiones a los arrays, simplemente se añaden corchetes. Como en el


siguiente ejemplo:

Ejemplo arrays con más de una dimensión

#!/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;

print $array2D[1][1]." ".$array3D[0][0][0]."\n";

3.- Arrays asociativos

Un array asociativo en Perl o tabla hash (como también se le denomina) es un array


donde los elementos son referenciados mediante claves en vez de una posición. Para
los array asociativos se utiliza el símbolo %. Al igual que sucede con los arrays
normales, cuando se accede a un elemento de un array asociativo se debe
referenciar como un escalar con el símbolo $. Además la indexación por clave no se
hace utilizando los corchetes, sino que se utilizan las llaves ({   }).

Ejemplo de utilización de arrays asocitivos:

#!/usr/bin/perl

#asignamos valores a una tabla hash


my %colorfruta;

$colorfruta{"verde"}="kiwi";
$colorfruta{"amarillo"}="platano";
$colorfruta{"rojo"}="sandía";
$colorfruta{"naranja"}="naranja";

print "Una fruta verde es: ".$colorfruta{"verde"}."\n";

%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 asociación también se puede hacer con =>, por ejemplo:

%semana=("Lunes"=> "L", "Martes" => "M");

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

podemos ver si una clave existe o no. Con delete($hash{clave}) se elimina un


elemento de un array asocitivo.

Las reglas de prioridad determinan el orden en el que se evalúan y se calculan las


expresiones.

La tabla enumera el orden de prioridad por defecto.

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

Prioridad del Operador AND

 En este ejemplo, tenemos dos condiciones:

• La primera condición es que el cargo es PRESIDENT y el salario mayor que


4000.
 La segunda condición es que el cargo es SALES.

Select ename, job, sal From emp


Where job= 'SALES' OR job = 'PRESIDENT' AND sal > 4000;

[Link]

La sentencia SELECT indica lo siguiente:


“Seleccionar la fila si un empleado es presidente (PRESIDENT) y gana más de 4000 o
si el empleado es vendedor (SALES).”

Uso de Paréntesis

 En este ejemplo, tenemos dos condiciones:

• La primera condición es que el cargo es PRESIDENT o SALES.


• La segunda condición es que el salario es mayor que 4000.

Select ename, job, sal From emp


Where (job = 'SALES' OR job = 'PRESIDENT') AND sal> 4000;
Programación Antonio G. Huerta

La sentencia SELECT indica lo siguiente:


“Seleccionar la fila si un empleado es presidente (PRESIDENT) o vendedor (SALES) y
gana más de 4000.”

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:

1. tipos de datos definidos por el usuario (el más alto)


2. sql_varian t
3. xml
4. datetimeoffset
5. datetime2
6. datetime
7. smalldatetime
8. date
9. time
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link] (incluyendo nvarchar(max) )
[Link]
[Link] (incluyendo varchar(max) )
[Link]
[Link] (incluyendo varbinary(max) )
Programación Antonio G. Huerta

[Link] (el más bajo)

EXPRESIONES

a menudo llamada también patrón, es una expresión que describe un conjunto de


cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas
Handel, Händel y Haendel se describe mediante el patrón "H(a|ä|ae)ndel". La
mayoría de las formalizaciones proporcionan los siguientes constructores: una
expresión regular es una forma de representar a los lenguajes regulares (finitos o
infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el
lenguaje. Específicamente, las expresiones regulares se construyen utilizando los
operadores unión, concatenación y clausura de Kleene.

[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

Numerosos editores de texto y otras utilidades (especialmente en el sistema


operativo UNIX/linux), como por ejemplo sed y awk, utilizan expresiones regulares
para, por ejemplo, buscar palabras en el texto y reemplazarlas con alguna otra
cadena de caracteres.

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:

 grep: programa de los sistemas operativos Unix/Linux


 PowerGrep: versión de grep para los sistemas operativos Windows
 RegexBuddy: ayuda a crear las expresiones regulares en forma interactiva y
luego le permite al usuario usarlas y guardarlas.
 EditPad Pro: permite realizar búsquedas con expresiones regulares sobre
archivos y las muestra por medio de código de colores para facilitar su lectura
y comprensión.

Motores para el programador: permiten automatizar el proceso de búsqueda de


modo que sea posible utilizarlo muchas veces para un propósito específico. Estas son
algunas de las herramientas de programación disponibles que ofrecen motores de
búsqueda con soporte a expresiones regulares:

 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.

Nota: de las herramientas mencionadas con anterioridad se utilizan el EditPad Pro y


el .Net Framework para dar ejemplos, aunque es posible utilizar las expresiones
regulares con cualquier combinación de las herramientas mencionadas. Aunque en
general las Expresiones Regulares utilizan un lenguaje común en todas las
herramientas, las explicaciones prácticas acerca de la utilización de las herramientas
y los ejemplos de código deben ser interpretados de forma diferente. También es
necesario hacer notar que existen algunos detalles de sintaxis de las expresiones
regulares que son propietarios del .Net Framework que se utilizan en forma diferente
en las demás herramientas de programación. Cuando estos casos se den se hará
notar en forma explícita para que el lector pueda buscar información respecto a estos
detalles en fuentes adicionales. En el futuro se incluirán adicionalmente ejemplos de
otras herramientas y lenguajes de programación.

Expresiones regulares como motor de búsqueda

Las expresiones regulares permiten encontrar porciones específicas de texto dentro


de una cadena más grande de caracteres. Así, si es necesario encontrar el texto "lote"
en la expresión "el ocelote salto al lote contiguo" cualquier motor de búsqueda sería
capaz de efectuar esta labor. Sin embargo, la mayoría de los motores de búsqueda
encontrarían también el fragmento "lote" de la palabra "ocelote", lo cual podría no
ser el resultado esperado. Algunos motores de búsqueda permiten adicionalmente
especificar que se desea encontrar solamente palabras completas, solucionando este
problema. Las expresiones regulares permiten especificar todas estas opciones
adicionales y muchas otras sin necesidad de configurar opciones adicionales, sino
utilizando el mismo texto de búsqueda como un lenguaje que permite enviarle al
motor de búsqueda exactamente lo que deseamos encontrar en todos los casos, sin
necesidad de activar opciones adicionales al realizar la búsqueda.

Expresiones regulares como lenguaje

Para especificar opciones dentro del texto a buscar se utiliza un lenguaje o


convención mediante el cual se le transmite al motor de búsqueda el resultado que
se desea obtener. Este lenguaje le da un significado especial a una serie de
caracteres. Por lo tanto cuando el motor de búsqueda de expresiones regulares
encuentre estos caracteres no los buscará en el texto en forma literal, sino que
buscará lo que los caracteres significan. A estos caracteres se les llama algunas
veces "meta-caracteres". A continuación se listan los principales meta-caracteres y su
función y como los interpreta el motor de expresiones regulares.
Programación Antonio G. Huerta

Descripción de las expresiones regulares

El Punto "."

El punto es interpretado por el motor de búsqueda como cualquier otro carácter


excepto los caracteres que representan un salto de línea, a menos que se le
especifique esto al motor de Expresiones Regulares. Por lo tanto si esta opción se
deshabilita en el motor de búsqueda que se utilice, el punto le dirá al motor que
encuentre cualquier carácter incluyendo los saltos de línea. En la herramienta
EditPad Pro esto se hace por medio de la opción "punto corresponde a nueva línea"
en las opciones de búsqueda. En .Net Framework se utiliza la opción RegexOptions.
Singleline al efectuar la búsqueda o crear la expresión regular.

El punto se utiliza de la siguiente forma: Si se le dice al motor de RegEx que busque


"g.t" en la cadena "el gato de piedra en la gótica puerta de getisboro goot" el motor
de búsqueda encontrará "gat", "gót" y por último "get". Nótese que el motor de
búsqueda no encuentra "goot"; esto es porque el punto representa un solo carácter y
únicamente uno. Si es necesario que el motor encuentra también la expresión "goot",
será necesario utilizar repeticiones, las cuales se explican más adelante.

Aunque el punto es muy útil para encontrar caracteres que no conocemos, es


necesario recordar que corresponde a cualquier carácter y que muchas veces esto no
es lo que se requiere. Es muy diferente buscar cualquier carácter que buscar
cualquier carácter alfanumérico o cualquier dígito o cualquier no-dígito o cualquier
no-alfanumérico. Se debe tomar esto en cuenta antes de utilizar el punto y obtener
resultados no deseados.

La barra inversa o contrabarra "\"

Se utiliza para "marcar" el siguiente carácter de la expresión de búsqueda de forma


que este adquiera un significado especial o deje de tenerlo. O sea, la barra inversa no
se utiliza nunca por sí sola, sino en combinación con otros caracteres. Al utilizarlo por
ejemplo en combinación con el punto "\." este deja de tener su significado normal y
se comporta como un carácter literal.

De la misma forma, cuando se coloca la barra inversa seguida de cualquiera de los


caracteres especiales que discutiremos a continuación, estos dejan de tener su
significado especial y se convierten en caracteres de búsqueda literal.

Como ya se mencionó con anterioridad, la barra inversa también puede darle


significado especial a caracteres que no lo tienen. A continuación hay una lista de
algunas de estas combinaciones:

 \t — Representa un tabulador.
Programación Antonio G. Huerta

 \r — Representa el "retorno de carro" o "regreso al inicio" o sea el lugar en que


la línea vuelve a iniciar.
 \n — Representa la "nueva línea" el carácter por medio del cual una línea da
inicio. Es necesario recordar que en Windows es necesaria una combinación
de \r\n para comenzar una nueva línea, mientras que en Unix solamente se
usa \n.
 \a — Representa una "campana" o "beep" que se produce al imprimir este
carácter.
 \e — Representa la tecla "Esc" o "Escape"
 \f — Representa un salto de página
 \v — Representa un tabulador vertical
 \x — Se utiliza para representar caracteres ASCII o ANSI si conoce su código.
De esta forma, si se busca el símbolo de derechos de autor y la fuente en la
que se busca utiliza el conjunto de caracteres Latin-1 es posible encontrarlo
utilizando "\xA9".
 \u — Se utiliza para representar caracteres Unicode si se conoce su código.
"\u00A2" representa el símbolo de centavos. No todos los motores de
Expresiones Regulares soportan Unicode. El .Net Framework lo hace, pero el
EditPad Pro no, por ejemplo.
 \d — Representa un dígito del 0 al 9.
 \w — Representa cualquier carácter alfanumérico.
 \s — Representa un espacio en blanco.
 \D — Representa cualquier carácter que no sea un dígito del 0 al 9.
 \W — Representa cualquier carácter no alfanumérico.
 \S — Representa cualquier carácter que no sea un espacio en blanco.
 \A — Representa el inicio de la cadena. No un carácter sino una posición.
 \Z — Representa el final de la cadena. No un carácter sino una posición.
 \b — Marca el inicio y el final de una palabra.
 \B — Marca la posición entre dos caracteres alfanuméricos o dos no-
alfanuméricos.

Nota: La utilidad [Link] de Windows permite encontrar los códigos


ASCII/ANSI/UNICODE para utilizarlos en Expresiones Regulares.

Los corchetes "[ ]"

La función de los corchetes en el lenguaje de las expresiones 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 caracteres. Dentro de los corchetes
es posible utilizar el guión "-" para especificar rangos de caracteres. Adicionalmente,
los metacaracteres pierden su significado y se convierten en literales cuando se
encuentran dentro de los corchetes. 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.]". Como se hizo notar anteriormente, dentro de los
Programación Antonio G. Huerta

corchetes, el punto representa un carácter literal y no un metacaracter, por lo que no


es necesario antecederlo con la barra 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 permite encontrar dígitos hexadecimales. Los
corchetes nos permiten también encontrar palabras aún si están escritas 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á "expresioon" o
"expresioón".

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.

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 lugares donde un punto
finalice la línea, lo que es útil para avanzar entre párrafos.

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 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.

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$" permite validar una
fecha en formato corto, aunque no permite verificar si es una fecha válida, ya que
99/99/9999 también sería válido en este formato; la validación completa de una
fecha también es posible mediante expresiones regulares, como se ejemplifica más
adelante.
Programación Antonio G. Huerta

Los paréntesis "()"

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:

 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 posteriormente
como se denota más adelante.
 Utilizados en conjunto con la barra "|" permite hacer búsquedas opcionales.
Por ejemplo la expresión regular "al (este|oeste|norte|sur) de" permite buscar
textos que den indicaciones por medio de puntos cardinales, mientras que la
expresión regular "este|oeste|norte|sur" encontraría "este" en la palabra
"esteban", no pudiendo cumplir con este propósito.
 Utilizado en conjunto con otros caracteres especiales que se detallan
posteriormente, ofrece funcionalidad adicional.

El signo de interrogación "?"

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".

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 caractér
a la vez, o un grupo de caracteres a la vez. Los metacaracteres enumerados en
adelante permiten establecer repeticiones.
Programación Antonio G. Huerta

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
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".

El signo de suma "+"

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".

Otra forma de utilizar los grupos es en el lenguaje de programación que se esté


utilizando. Cada lenguaje tiene una forma distinta de acceder a los grupos. Los
ejemplos enumerados a continuación utilizan las clases del .Net Framework, usando
la sintáxis de C# (la cual puede fácilmente 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 [Link]. 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 _TagParser.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 _TagParser.Matches(sText)){


String sTagName = CurrentMatch. Groups[1].Value;
}
Programación Antonio G. Huerta

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.

Utilizando el ejemplo anterior es posible convertir "<([a-zA-Z]\w*?)>" en "<(?


<TagName>[a-zA-Z]\w*?)>" Para encontrar etiquetas HTML. Nótese el signo de
pregunta y el texto "TagName" encerrado entre parentesis triangulares, seguido de
este. 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 = CurrentMatch. Groups["TagName"]. Value;
}

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:

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]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?
<Value>[\w-:;,\./= \r\n]*?)'?"? ?)>"

Esta expresión permite encontrar el nombre de la etiqueta, el nombre del atributo y


su valor.

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]*?)'?"? ?)*?>"

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"]. 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>"

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.

También podría gustarte