Hay algunos desafíos bastante geniales relacionados con la expresión regular ( expresiones regulares de coincidencia , expresiones regulares que validan expresiones regulares )
Esto puede ser imposible, pero ¿hay una expresión regular que SOLO coincida?
NOTA: se deben incluir delimitadores:
por ejemplo /thing/
debe coincidir /thing/
y no thing
. La única coincidencia posible para su expresión debe ser la expresión misma. Muchos lenguajes permiten la implementación de una cadena en lugar de una expresión regular. Por ejemplo en Go
package main
import "fmt"
import "regexp"
func main() {
var foo = regexp.MustCompile("bar")
fmt.Println(foo.MatchString("foobar"))
}
pero en aras del desafío, deje que la expresión se delimite (símbolo inicial, expresión, símbolo final ej: /fancypantpattern/
o @[^2048]@
), si desea argumentar citas como su delimitador, que así sea. Creo que dada la aparente dificultad de este problema, no habrá mucha diferencia.
Para ayudarte a lo largo:
Hack rápido que armé para rubular.com (una página web para la edición de ruby regex):
var test = document.getElementById("test")
,regex = document.getElementById("regex")
,delimiter="/"
,options = document.getElementById("options")
,delay = function(){test.value = delimiter + regex.value + delimiter + options.value}
,update = function(e){
// without delay value = not updated value
window.setTimeout(delay,0);
}
regex.onkeydown = update;
options.onkeydown = update;
Aunque técnicamente se trata de un "código de golf", me impresionará mucho si alguien puede encontrar una respuesta / demostrar que es imposible.
El enlace ya está arreglado. Perdon a todos
Respuesta ganadora hasta el momento: jimmy23013 con 40 caracteres
fuente
aaa
pero no / aaa ///
delimitadores, o podemos elegir otros delimitadores (PCRE admite casi cualquier carácter, y en particular puede usar paréntesis / llaves / corchetes coincidentes como delimitadores)."/
y/"
Respuestas:
Sabor PCRE,
2612892101841271097153514440 bytes¡Sí, es posible!
Pruébalo aquí (Pero
/
se muestra que es el delimitador en Regex101.)Abstenerse de realizar ediciones innecesarias (actualizaciones) en la página Regex101. Si su edición en realidad no implica mejorar, probar o probar esta expresión regular, puede bifurcarla o crear otras nuevas desde su página de inicio .
La versión funciona más correctamente en Regex101 (44 bytes):
Pruébalo aquí
Esto es mucho más simple que la versión original y funciona más como una quine tradicional. Intenta definir una cadena sin usarla y usarla en un lugar diferente. Por lo tanto, se puede colocar muy cerca de un extremo de la expresión regular, para reducir la cantidad de caracteres que necesitan más caracteres para definir el patrón coincidente y se repiten más veces.
Explicaciones:
\Q^\/()(?R){2}\/\z|\1\Q
coincide con la cadena^\/()(?R){2}\/\z|\1\Q
. Esto utiliza una peculiaridad que\Q...\E
no tiene que cerrarse, y los delimitadores sin escape funcionan\Q
. Esto hizo que algunas versiones anteriores funcionaran solo en Regex101 y no localmente. Pero afortunadamente la última versión funcionó, y aproveché algunos bytes más usando esto.\1
antes de que\Q
coincida con el grupo capturado 1. Debido a que el grupo 1 no existe en esta opción, solo puede coincidir en llamadas recursivas. En llamadas recursivas, coincide con cadenas vacías.(?R){2}
llama a la expresión regular completa de forma recursiva dos veces, que coincide^\/()(?R){2}\/\z|\1\Q
para cada vez.()
no hace más que capturar una cadena vacía en el grupo 1, que habilita la otra opción en llamadas recursivas.^\/()(?R){2}\/\z
coincide(?R){2}
con delimitadores añadidos, desde el principio hasta el final. El\/
antes de que las llamadas recursivas también se aseguró de esta opción en sí no coincide en llamadas recursivas, porque no va a estar al principio de la cadena.51 bytes con cerrado
\Q...\E
:Pruébalo aquí
Versión original, 188 bytes
¡Gracias a Martin Büttner por jugar unos 100 bytes!
Pruébalo aquí
O 210 bytes sin
\Q...\E
:Pruébalo aquí
Versión ampliada:
Las extensiones comoLa referencia inversa no es regular, pero la búsqueda anticipada sí.(?=
y\1
han hecho que las llamadas expresiones "regulares" ya no sean regulares, lo que también hace posible las quines.Explicación:
\2\
en lugar de\
escapar de caracteres especiales. Si\2
coincide con la cadena vacía,\2\x
(dondex
es un carácter especial) coincide con lax
propia. Si\2
coincide\2\
,\2\x
coincide con el que se escapó.\2
en las dos coincidencias del grupo 1 puede ser diferente en expresiones regulares. En la primera vez\2
debe coincidir con la cadena vacía, y la segunda vez\2\
.\Q\2\)){2}.{11}$\E\/\z
(línea 1) coincide con 15 caracteres del final. Y.{11}$
(línea 7) coincide con 11 caracteres del final (o antes de una nueva línea final). Por lo tanto, el patrón justo antes del segundo patrón debe coincidir con los primeros 4 o 3 caracteres del primer patrón, por lo que\2\.\2\|\2\)\2\)
debe coincidir con...\2\)
o...\2\
. No puede haber una nueva línea final porque el último carácter debería ser)
. Y el texto coincidente no contiene otro)
antes del más a la derecha, por lo que todos los demás caracteres deben estar en el\2
.\2
se define como(.2.|)
, por lo que solo puede ser\2\
.\2
. Y las cosas después del grupo 1 coinciden con 11 caracteres. Entonces, la longitud total de las dos veces\2
debe ser exactamente 3 caracteres. Sabiendo\2
por segunda vez que tiene 3 caracteres, debe estar vacío por primera vez.\2
son literales en el grupo 1. Con las dos veces\2
conocidas y los últimos caracteres conocidos desde la primera línea, esta expresión regular coincide exactamente con una cadena.Regex sin recursiones o referencias posteriores, 85 bytes
Alguien puede argumentar que las expresiones con recursiones o referencias inversas no son expresiones "regulares" reales. Pero las expresiones con solo anticipación solo pueden coincidir con los lenguajes regulares, aunque pueden ser mucho más largos si se expresan mediante expresiones regulares tradicionales.
Pruébalo aquí
610 bytes sin
\Q...\E
(para jugar golf):Pruébalo aquí
La idea es similar.
La expresión regular básica
Si no se permite la búsqueda anticipada, lo mejor que puedo hacer ahora es:
que coincide
Si
{m,n}
no se permite el cuantificador, es imposible porque nada que solo pueda coincidir con una cadena, puede coincidir con una cadena más larga que sí misma. Por supuesto, uno todavía puede inventar algo como lo\q
que solo coincide/\q/
, y aún decir expresiones con ese regular. Pero aparentemente nada de esto es compatible con las principales implementaciones.fuente