¡Esta es una revisión vieja del documento!
Patrón de expresiones regulares Siette
Este patrón es una versión simplificada en algunos casos y extendida en otros de las expresiones regulares que pueden encontrarse en muchos lenguajes de programación como Java, Javascript, Perl, etc. Una expresion regular no es mas que una forma de definir un lenguaje regular, es decir, un conjunto de secuencias de caracteres.
Expresiones básicas
Los patrones son a su vez cadenas de caracteres, y utilizan como base el mismo alfabeto por lo que es necesario tomar ciertas precauciones al escribir algunos caracteres que tienen un significado especial. En la siguiente tabla se muestran los patrones y el caracter que representan. Siguiendo la notación clásica en esta materia llamaremos “lexemas” a las secuencias de caracteres reconocidas por el patrón.
Caracteres individuales
En general cualquier caracter no especial se representta a si mismo. Los caracteres especiales deben llevar una barra invertida \ en el patrón como indica la siguiente tabla:
Patrón | Lexema |
---|---|
\? | ? |
\+ | + |
\* | * |
\| | | |
\( | ( | | \) | ) |
\{ | { |
\} | } |
\[ | [ | | \] | ] |
\# | # |
\$ | $ |
| \ |
Concatenación
La concatenación de dos expresiones regulares da como resultado otra expresión regular que representa todas las posibles combinaciones de los lexemas de la primera expresion con todos los posibles lexemas de la segunda. A continuación se dan algunos ejemplo simbles.
Patrón | Lexema |
---|---|
abc | abc |
a\*c | a*c |
\\\\ | \ |
Más adelante se verán nuevos ejemplos.
Disyunción
El carácter especial | representa la alternativa o disyunción, se usa para combinar posibles respuestas en el patrón, por ejemplo:
Patrón | Ejemplo de Lexema |
---|---|
a|e|i|o|u | i |
u | |
altura|altitud | altitud |
altura | |
\+|-|\*|/ | + |
* |
Paréntesis
Los paréntesis tienen la misión de agrupar una misma expresión regular, cambiando las prioridades de operación. Todo lo que esta entre paréntesis se considera como una sola expresión frente a las operaciones de concatenación disyunción.
Patrón | Ejemplo de Lexema |
---|---|
alt(o|a) | alto |
alta | |
(C|c)ol(o|ó)n | Colón |
colon | |
(pa|ma|ra)|(ta|la) | pala |
mata |
Paréntesis angulares
Los paréntesis angulares, sirven para denotar disyunciones de un solo símbolo, es decir, son simplemente modos abreviados de escribir expresiones que podrían escribirse con paréntesis
Patrón | Ejemplo de Lexema |
---|---|
alt[oa] | alto |
alta | |
[aeiou] | a |
u | |
[Cc]ol[oó]n | Colón |
colon |
Llaves
Las llaves {} tienen también un significado especial. Las expresiones que se sitúan entre llaves se entiende que son opcionales, es decir, que pueden aparecer o no en la respuesta. A continuación se muestran como algunos patrones, ejemplos de lexemas válidos y no válidos.
Patrón | Ejemplo de lexemas | lexemas no válidos |
---|---|---|
30{km|kilometros} | 30 | 30m |
30km | km | |
x={a}{b}{c} | x=a | x=aaa |
x=ac | x=ca | |
x= | x=abcabc | |
{[Cc]rist[oó]bal} [Cc]ol[oó]n | Colón | Cristotal |
cristobal colon | colon Cristobal |
Comodín
El carácter especial ? se usa para denotar representa a un (uno y sólo uno) símbolo cualquiera, sin especificar cual. ejemplos:
Patrón | Ejemplo de lexemas | lexemas no válidos |
---|---|---|
alt? | alto | alt |
alta | al | |
alt+ | +alt | |
x=? | x=a | x=aaa |
x=b | x=ca | |
x=9 | x=abcabc | |
{[Cc]rist[oó]bal} [Cc]ol[oó]n | Colón | Cristotal |
cristobal colon | colon Cristobal |
Comodín de secuencia
El carácter especial * se usa para denotar una secuencia de cero, uno o más caracteres cualesquiera. ejemplos:
Patrón | Ejemplo de lexemas | lexemas no válidos |
---|---|---|
A*Z | ABCXYZ | ZYXCBA |
A+B+Z | A | |
AZ | Z | |
x=30* | x=30km | 30 |
x=30m | y=30 | |
x=3000 | x=00 | |
*[Cc]ol[oó]n | Colón | Cristotal |
cristobal colon | colon Cristobal | |
fernando colon |
Permutaciones
El operador + se usa para poder generar permutaciones en el orden de respuesta. Es un operador binario que afecta a las dos expresiones situadas a derecha e izquierda. Dado que el número de permutaciones crece factorialmente con el número de expresiones, a efectos practicos se limita a 6 el número de expresiones que pueden interoperarse con el operador +, Tenga en cuenta que 6! = 720, pero que 7! = 5040 lo que supone un tiempo de cálculo excesivo para una pregunta.
Patrón | Ejemplo de lexemas | lexemas no válidos |
---|---|---|
a+b+c | abc | ab |
bac | ac | |
cba | bbb | |
p[aeiou]+t[aeiou]+l[aeiou] | lupa | ptl |
pelota | papa | |
tapa | lapiz |
Final de expresión
El carácter especial $ indica el final de la expresión correspondiente al patrón. Sólo se usa internamente, por lo que debe utilizarse la secuencia \$ para incluir este carácter en las respuestas.
Evidentemente, la potencia que ofrece el uso de estas expresiones en la definición de patrones de respuesta está limitado por el grado de tolerancia a fallos que se haya decidido aceptar. Se deja a criterio del profesor el buen uso de estas expresiones. Como consejo general a la hora de crear preguntas de respuesta libre, lo mejor es concretar al máximo posible la pregunta, de manera que no existan muchas ambigüedades.
Ejemplo 1
Enunciado | Indique el nombre de alguna novela de Hemingway |
---|---|
Patrón. |
Ejemplo 7
Enunciado | ¿Cuál es el valor de la constante <html>π</html>? |
---|---|
Patrón. | <html><code>3.14|3.1416|3.14159{2{[67]}}<code></html> |
Respuestas reconocidas | 3.14 |
3.1416 | |
3.1415927 | |
Respuestas no reconocidas | <html><font color=“red”>3.1415926536</font></html> |
<html><font color=“red”>+3.1416</font></html> |
Como puede verse, la precisión de la respuesta plantea un problema a la correspondencia meramente lexica.
Para resolver este problema que plantea la habitual interpretación de las secuencias de caracetres que representan digitos como valores numéricos, se han definido en este patrón expresiones númericas. Estas expresiones son especialmente adecuadas cuando se trabaja con números reales, ya que permiten definir la precisión con la que se aceptaran las entradas del usuario. Las expresiones numéricas pueden concatenarse normalmente dentro de los patrones de respuesta. Un número puede definirse en el patrón de dos formas: