Sua missão é escrever a expressão regular válida mais curta que nenhuma string possa corresponder, incluindo a string vazia.
Os envios devem ter este formato ("notação literal"):
/pattern/optional-flags
Regexp mais curto vence. O tamanho da regexp é contado em caracteres. (incluindo barras e bandeiras)
Por favor, explique como o seu regexp funciona (se não for trivial)
Obrigado e divirta-se!
Respostas:
6 caracteres
Seguindo as respostas de primo e Peter Taylor, e uma dica de
man perlre
:/(?!)/
Esse regex compatível com perl corresponde a uma sequência vazia que não é seguida por outra sequência vazia.
fonte
/x\by/
, mas se eu realmente tivesse que usar uma regex como essa - por qualquer motivo -, essa resposta também será a mais clara)/(*FAIL)/
é provavelmente mais claro, no entanto. (E, na verdademan perlre
dada por ele ao mencionar que o meu realmente se expande para o seu internamente.)/(*FAIL)/
não é tão portátil. E mesmo em Perl, acho que é uma característica mais obscura do que uma aparência negativa.-Mre=debug
) diz que(?!)
é otimizada(*FAIL)
pelo otimizador de regex do Perl (deOPFAIL
acordo com-Mre=debug
). Além disso, acho que não vi(*FAIL)
fora do Perl 5 (e do Perl 6, onde é chamado<!>
).8 caracteres
Exigimos uma string contendo um caractere que é ambos
a
eb
, o que é obviamente impossível.fonte
/(?!x)x/
parece ainda mais impossível ;-)5 caracteres
Ao contrário de todos que abusam
$
e^
... isso realmente funciona no Perl:\A
corresponde ao início da string.fonte
^
.6 caracteres
Baseado na resposta de Sven Hohenstein .
fonte
8 caracteres
Um limite de palavra (
\b
) cercado por caracteres de 'palavra' (\w
- um de[_a-zA-Z0-9]
). É incomparável, pois um dos caracteres que precede ou segue um limite de palavra deve ser um caractere que não seja 'palavra'.A propósito: isso é semelhante à expressão inigualável
onde
\W
significa caractere não-palavra.fonte
/
contam. Veja a entrada do OP, por exemplo . É uma ótima entrada, no entanto!4 caracteres
procura um "a" após o final da string.
ou
pesquisa a antes do início da string.
fonte
^
e$
em posições "ilegais" apenas faz com que sejam tratadas como caracteres comuns. Seu primeiro exemplo coincide com os literais$a
emsed
e provavelmente outros programas.echo 'a^b' | grep 'a^b'
vs.echo 'a^b' | grep -E 'a^b'
. Confira 9.4.9 ERE Expression5 caracteres
/$.^/
/$^/
corresponderá a uma cadeia vazia, enquanto exigir um caractere intermediário não corresponderá.fonte
"$a^"
(ou qualquer coisa no lugar do'a'
) em Perl ( e talvez sed ). Ainda bem legal!$.
como a variável atual do número da linha. O que pode estar vazio; nesse caso, será/^/
.^
e$
'$^'
com grep, mas infelizmente ele correspondia à string'$^'
. Smartass grep.9 caracteres
Não tenho certeza, mas
/[^\S\s]/
deve ser inigualável, pois não significa nenhum personagem, mas pelo menos um deles.fonte
+
.6 caracteres
Eu acho que esse regex que fiz funcionará:
Corresponde a um limite de palavras (
\b
) que não é um limite de palavras (\B
). O que é imposição - eu realmente tenho que explicar isso para você?fonte
4 caracteres
(Apenas sabor ECMAScript)
Em outros tipos, essa não é uma classe de caracteres válida (
]
seria considerada um caractere na classe, portanto a expressão não é válida, porque a classe nunca é fechada), mas o padrão ECMAScript aceita classes de caracteres vazias. Como é uma classe, ele deve corresponder a um caractere (para que as cadeias vazias não correspondam), mas como nenhum caractere é incluído, nenhum caractere real também será correspondente.fonte
/[]{0}/
. (. Ps embora a minha própria resposta parcialmente parece com a sua, eu realmente ler o seu depois de escrever a minha.)/[]/.test("")
. retorna falso. uma classe de caractere nunca pode corresponder a uma string vazia, mesmo que não contenha caracteres (imagino que eles sejam implementados como "SE o próximo caractere da string for um dos listados, corresponda; ELSE falhar")./[]{0}/
é legal (no ECMAScript) e corresponde à cadeia vazia ... no entanto, não tenho certeza de como isso é relevante para a minha resposta.6 caracteres
O quantificador possessivo procura o maior número possível de b e, em seguida, mais 1. 6 caracteres, mas aponta para simetria?
fonte
6 caracteres
Não sou um vencedor, mas achei divertido. grep e Python vomitam neste, mas Perl parece bem com isso.
Parece ser muito dependente da implementação (o que não surpreende, dada a sua estranheza). Bob relata abaixo que ele corresponde a qualquer coisa no mecanismo de expressão regular do JavaScript.
fonte
Talvez um pouco de trapaça, mas ...
... é inigualável em regex POSIX em praticamente todas, se não todas, implementações. RE BÁSICO e RE estendido, até.
E o POSIX RE não precisa dessas barras e bandeiras traquinas que o PCRE possui.
fonte
0
não funciona em PERL."0"=~0
é verdade ...\0
ITYM? Sim, a maioria das implementações perlre (1) e PCRE não usa cadeias C, mas buffers limitados por tamanho, nos quais esse truque não funcionará, mas a maioria das implementações POSIX RE trabalha com cadeias C.5 caracteres
Corresponde a sequência que começa com qualquer caractere único antes do início da sequência.
fonte
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
e.
são metacaracteres não literais, que precisam ser escapou4 caracteres:
Funciona com o GNU grep 2.5.1 e egrep.
fonte
/.^/
= 4 caracteres.//
? aqueles que não são necessários em todos os lugares ;-)/
contam, veja a pergunta original ("incluindo barras e sinalizadores") e a entrada do OP .Perl 6 (5 caracteres)
Sorta regra abuso (porque as expressões regulares do Perl 6 são diferentes e incompatíveis com as expressões regulares padrão), mas eu não me importo.
<!>
A regra informa ao Perl 6 que o regex não corresponde.fonte
6 bytes
Abreviação de
(*FAIL)
, suportada por mecanismos de regex compatíveis com perl. Obrigado a @HamZa por apontar isso.9 bytes
Deve funcionar com qualquer mecanismo de expressão regular que suporte verbos. Não estou convencido de que isso realmente precise ser jogado de novo.
fonte
(*FAIL)
é um verbo que sempre falha./(*F)/
:)4 caracteres
Precisa de qualquer caractere após o término da string
fonte
$
é especial apenas no final do padrão.4 caracteres com barras 2 sem
No mecanismo de expressão regular da linguagem TXR, uma classe de caracteres vazia
[]
não corresponde a nenhum caractere e, portanto, a nenhuma string. Ele se comporta dessa maneira porque a classe de caracteres requer uma correspondência de caracteres e, quando está vazia, especifica que nenhum personagem pode satisfazê-la.Outra maneira é inverter o regex "conjunto de todas as strings, incluindo vazio"
/.*/
usando o operador complemento:/~.*/
. O complemento desse conjunto não contém seqüências de caracteres e, portanto, não pode corresponder a nada.Tudo isso está documentado na página do manual:
As barras não fazem parte da sintaxe regex em si; eles são apenas pontuação que delimita expressões regulares na notação de expressão S. Testemunha:
fonte
6 caracteres
(ou 4, dependendo de como você olha)
fonte
Este é um regex de 5 caracteres.
Corresponde a um grupo vazio 1 ou mais vezes.
EDITAR:
Removida minha resposta para outros sabores:
Qualquer coisa que não seja um número dentro de {} corresponderá ao texto.
Este irá corresponder a ". {- 1}"
fonte
5 caracteres
Espero que isso não pareça estúpido:
/[]+/
fonte
Uma coisa que termina antes de começar ...
fonte
""
, ele não coincidir com uma string contendo esses dois caracteres literais:"$^"
.