¿Sabe por qué las "expresiones regulares" se llaman "regulares"? :-)
Eso sería demasiado largo para explicarlo, solo voy a delinear el camino. Para hacer coincidir un patrón (es decir, decidir si una cadena dada es "válida" o "inválida"), un informático teórico usaría un finite state automaton. Esa es una máquina abstracta que tiene un número finito de estados; cada tick lee un carácter de la entrada y salta a otro estado. El patrón de dónde saltar desde un estado particular cuando se lee un personaje en particular es fijo. Algunos estados están marcados como "OK", algunos como "FAIL", por lo que al examinar el estado de una máquina puede verificar si su texto es "válido" (es decir, un correo electrónico válido).
Por ejemplo, esta máquina sólo acepta "agradable" como su palabra "válida" (una imagen de Wikipedia):
![a picture from Wikipedia article referenced above](https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Fsm_parsing_word_nice.svg/400px-Fsm_parsing_word_nice.svg.png)
Un conjunto de palabras "válidos" una máquina de este tipo, teóricamente, puede distinguir de inválido se llama "regular language". No todos los conjuntos son un lenguaje regular: por ejemplo, los autómatas de estados finitos son incapaces de verificar si los paréntesis en la cadena están equilibrados.
Pero la construcción de máquinas de estado era una tarea compleja, en comparación con la complejidad de definir qué es "válido". Entonces los matemáticos (principalmente S. Kleene) notaron que cada regular language podría describirse con un "regular expression". Tenían *
sy |
y eran los prototipos de lo que ahora conocemos como expresiones regulares.
¿Qué tiene que ver con el problema?El problema en el tema es esencialmente no regular. No se puede expresar con nada que funcione como un autómata finito.
La esencia es que debe contener una celda de memoria que sea capaz de contener un número arbitrario (recuento de repeticiones en su caso). Los autómatas finitos y las expresiones regulares clásicas no pueden hacer esto.
Sin embargo, las expresiones regulares modernas son más expresivas y are said to be able to check balanced parentheses! Pero esto puede servir como un buen ejemplo de que no debe usar expresiones regulares para tareas que no convengan. Y mucho menos que contenga fragmentos de código; esto hace que la expresión esté lejos de ser "regular".
Respondiendo a la pregunta inicial, no puede resolver su problema con el uso de cualquier cosa "normal" solo. Sin embargo, las expresiones regulares podrían ser ayudarle en la solución de este problema, como en tster's answer
Tal vez, debería mirar más de cerca a tster's answer (hacer un "1" no, por favor!) Y mostrar por qué no es el "regular expresión "solución". Uno puede pensar que sí lo es, solo contiene una declaración de impresión (no es esencial) y un concepto de bucle y bucle es compatible con la potencia expresiva del autómata de estado finito. Pero hay una cosa más difícil de alcanzar:
while ($line =~ s/^([a-z]+)(\d+)//i)
{
print $1
x # <--- this one
$2;
}
La tarea de leer una cadena y un número y la impresión en varias ocasiones que cadena dada varias veces, donde el número es un entero arbitrario, se puede deshacer en un estado finito máquina sin memoria adicional. Utiliza una celda de memoria para mantener ese número y disminuirlo, y verifica que sea mayor que cero. Pero este número puede ser arbitrariamente grande, y contradice con una memoria finita disponible para la máquina de estado finita.
Sin embargo, no hay nada de malo en el patrón clásico /([abc]*){5}/
que coincide con algo "regular" repetido fijo número de veces. En esencia, tenemos estados que corresponden a "patrón combinado una vez", "patrón combinado dos veces" ... "patrón combinado 5 veces". Hay un número finito de ellos, y esa es la esencia de la diferencia.
No fue una respuesta, pero no pude resistirme a citar esto: "Algunas personas, cuando se enfrentan con un problema, piensan 'Lo sé, usaré expresiones regulares'. Ahora ellos tienen dos problemas." - Jamie Zawinski –
Esa cita de Jamie Z es una de mis favoritas también. – APC
Pascal MARTIN - ¿Me aclararías, por qué tienen dos problemas? (Tengo muchas ganas de saber). ---- Sobre la pregunta, creo que el RegEx me parece correcto y no parece que deba coincidir con 'a1b'. ¿Estás seguro de eso, Siddhant? – NawaMan