Há alguns desafios bem legais lá fora, envolvendo regex ( regex auto-matching , Regex validar regex )
Isso pode muito bem ser impossível, mas existe uma regex que SÓ corresponderá a si mesma?
NOTA, delimitadores devem ser incluídos:
por exemplo, /thing/
deve corresponder /thing/
e não thing
. A única correspondência possível para sua expressão deve ser a própria expressão. Muitos idiomas permitem a implementação de uma string no lugar de uma expressão regular. Por exemplo, em Go
package main
import "fmt"
import "regexp"
func main() {
var foo = regexp.MustCompile("bar")
fmt.Println(foo.MatchString("foobar"))
}
mas para o desafio, deixe a expressão ser delimitada (símbolo inicial, expressão, símbolo final ex: /fancypantpattern/
ou @[^2048]@
), se você quiser argumentar aspas como seu delimitador, que assim seja. Penso que, dada a aparente dificuldade deste problema, não fará muita diferença.
Para ajudá-lo:
Corte rápido que montei para o rubular.com (uma página da web para edição 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;
Mesmo que isso seja tecnicamente 'código de golfe', ficarei muito impressionado se alguém puder encontrar uma resposta / provar que é impossível.
O link agora está corrigido. Desculpe a todos
Resposta vencedora até agora: jimmy23013 com 40 caracteres
fonte
aaa
, mas não / aaa ///
delimitadores ou podemos escolher outros delimitadores (o PCRE suporta praticamente qualquer caractere e, em particular, você pode usar parênteses / chaves / colchetes correspondentes como delimitadores)."/
e/"
Respostas:
Sabor PCRE,
2612892101841271097153514440 bytesSim, é possível!
Experimente aqui. (Mas
/
é mostrado como o delimitador no Regex101.)Evite fazer edições desnecessárias (atualizações) na página Regex101. Se a sua edição não envolver realmente a melhoria, a tentativa ou o teste desse regex, você poderá bifurcar ou criar novos a partir da página inicial .
A versão funciona mais corretamente no Regex101 (44 bytes):
Experimente aqui.
Isso é muito mais simples que a versão original e funciona mais como um quine tradicional. Ele tenta definir uma string sem usá-la e usá-la em um local diferente. Portanto, ele pode ser colocado muito próximo a uma extremidade da regex, para reduzir o número de caracteres que precisam de mais caracteres para definir o padrão de correspondência e repetir mais vezes.
Explicações:
\Q^\/()(?R){2}\/\z|\1\Q
corresponde à string^\/()(?R){2}\/\z|\1\Q
. Isso usa uma peculiaridade que\Q...\E
não precisa ser fechada e delimitadores sem escape trabalham\Q
. Isso fez com que algumas versões anteriores funcionassem apenas no Regex101 e não localmente. Felizmente, porém, a versão mais recente funcionou e eu dediquei mais alguns bytes usando isso.\1
antes da\Q
correspondência com o grupo capturado 1. Como o grupo 1 não existe nesta opção, ele pode corresponder apenas em chamadas recursivas. Em chamadas recursivas, corresponde a cadeias vazias.(?R){2}
chama o regex inteiro duas vezes recursivamente, o que corresponde^\/()(?R){2}\/\z|\1\Q
a cada vez.()
não faz nada além de capturar uma sequência vazia no grupo 1, o que habilita a outra opção em chamadas recursivas.^\/()(?R){2}\/\z
combina(?R){2}
com delimitadores adicionados, do começo ao fim. O\/
antes das chamadas recursivas também assegurava que essa opção não correspondesse nas chamadas recursivas, porque não estará no início da sequência.51 bytes com fechado
\Q...\E
:Experimente aqui.
Versão original, 188 bytes
Agradecemos a Martin Büttner por jogar cerca de 100 bytes!
Experimente aqui.
Ou 210 bytes sem
\Q...\E
:Experimente aqui.
Versão expandida:
Extensões comoA referência anterior não é regular, mas sim.(?=
e\1
tornaram as chamadas expressões "regulares" não mais regulares, o que também possibilita quines.Explicação:
\2\
no lugar de\
para escapar de caracteres especiais. Se\2
corresponde à sequência vazia,\2\x
(ondex
é um caractere especial) corresponde àx
própria. Se\2
corresponder\2\
,\2\x
corresponde ao escapado.\2
nas duas correspondências do grupo 1 podem ser diferentes em regex. Na primeira vez\2
deve corresponder à cadeia vazia e na segunda vez\2\
.\Q\2\)){2}.{11}$\E\/\z
(linha 1) corresponde a 15 caracteres no final. E.{11}$
(linha 7) corresponde a 11 caracteres do final (ou antes de uma nova linha à direita). Portanto, o padrão imediatamente antes do segundo padrão deve corresponder aos 4 ou 3 primeiros caracteres do primeiro padrão, portanto,\2\.\2\|\2\)\2\)
deve corresponder a...\2\)
ou...\2\
. Não pode haver uma nova linha à direita porque o último caractere deve ser)
. E o texto correspondente não contém outro)
antes do mais à direita, portanto, todos os outros caracteres devem estar no\2
.\2
é definido como(.2.|)
, portanto, só pode ser\2\
.\2
. E as coisas após o grupo 1 correspondem a 11 caracteres. Portanto, o comprimento total das duas vezes\2
deve ser exatamente 3 caracteres. Sabendo\2
que a segunda vez tem 3 caracteres, ele deve estar vazio pela primeira vez.\2
é literal no grupo 1. Com os dois tempos\2
conhecidos e os últimos poucos caracteres conhecidos da primeira linha, esse regex corresponde exatamente a uma sequência.Regex sem recursões ou referências anteriores, 85 bytes
Alguém pode argumentar que expressões com recursões ou referências anteriores não são expressões "regulares" reais. Mas expressões com apenas lookahead ainda podem corresponder apenas a idiomas regulares, embora possam ser muito mais longas se expressadas por expressões regulares tradicionais.
Experimente aqui.
610 bytes sem
\Q...\E
(para jogar golfe):Experimente aqui.
A ideia é semelhante.
A expressão regular básica
Se lookahead não for permitido, o melhor que posso fazer agora é:
que corresponde
Se o
{m,n}
quantificador não for permitido, é impossível porque nada que possa corresponder apenas a uma sequência pode corresponder a uma sequência mais longa que ela mesma. É claro que ainda é possível inventar algo como o\q
que apenas corresponde/\q/
e ainda dizer expressões com esse regular. Mas, aparentemente, nada disso é suportado pelas principais implementações.fonte