Considere uma linguagem regex com o quantificador ganancioso , o quantificador não-viciado, alternância ordenada e classes de caracteres. (Essa é essencialmente uma sub-linguagem do PCRE, sem referências anteriores, afirmações gerais ou alguns dos outros bits mais sofisticados.)∗ ?
Uma correspondência para um regex em uma sequência é um intervalo semiaberto sobre modo que seja aceito por .R s = s 0 … s n N s a 0 … s a 1 - 1 R
Damos uma definição recursiva do que torna uma correspondência melhor que a outra. Uma correspondência para a expressão regular R em uma sequência é melhor que outra correspondência b = [ b 0 , b 1 ) se a 0 < b 0 ou, se a 0 = b 0 e:
Se é uma classe de personagem: As classes de caracteres têm correspondências únicas, portanto, todas as correspondências na mesma posição para R são iguais. Portanto, este caso é impossível.
Se :
- A parte principal de é uma correspondência melhor para S do que a parte principal de b , ou
- As principais partes de e b são igualmente bons resultados para S , e a porção traseira de uma for mais semelhante para T do que o troço traseiro de b .
Se :
- é uma correspondência para S e b não é, ou
- e b são iguais para S e a é melhor para S do que b , ou
- e b não são resultados para S , mas são jogos para T , e um é uma melhor correspondência para T do que b é.
Todas as outras formas sintáticas são reduzidas às três acima para fins de prioridade de correspondência:
- : R ≡ S 0 | S 1 | …
- : R ≡ ... | S 1 | S 0
Esses padrões infinitos são usados apenas para fins de prioridade de correspondência - eles não fazem parte do idioma da correspondência em consideração.
A relação "melhor" é uma ordem linear fraca em todas as correspondências possíveis para um determinado padrão.
Chamada duas expressões regulares match-equivalente se, para toda a cadeia de entrada finito, o conjunto de pares disjuntos melhor correspondência com S é igual ao conjunto de pares disjuntos melhores jogos para T .
P: É o caso de cada regex contém o quantificador não-remediado ∗ ? existe um regex equivalente de correspondência T que não contém quantificadores não-remediados?
Editar: Esta é uma reescrita completa da pergunta para esclarecer o que estava sendo solicitado.
fonte
\tt
Não impede LaTeX de interpretar caracteres especiais e seqüências de controle!)a+?
) ainda é {a ^ n: n≥1}. Se você executar uma correspondência regex não ancorada (como'aaaa' =~ /a+?/
em Perl), não obteráaaaa
como resultado, mas isso ocorre apenas porque as ramificações são tentadas em uma ordem diferente daa+
. Se você fizer isso adequadamente com âncoras (como'aaaa' =~ /^a+?\z/
no Perl), obtém oaaaa
resultado.//g
em Perl) retornaria?Respostas:
Essa resposta é baseada no pressuposto de que a equivalência de dois regexes é definida à medida que eles reconhecem o mesmo idioma. Não responde à pergunta atual.
Você tem um mal-entendido comum de que quantificadores relutantes alteram o conjunto de strings às quais uma expressão regular corresponde. Isso não acontece e apenas altera quais opções são tentadas primeiro.
Por exemplo, se você executar uma correspondência de regex
'aaaa' =~ /a+/
no Perl, ela localizará a primeira correspondência na sequênciaaaaa
e lembrará qual substring correspondeu a uma variável especial. Mesmo se houver mais de uma substringaaaa
que corresponda ao regex especificado, as correspondências diferentes da primeira serão ignoradas.Se os quantificadores são gananciosos ou relutantes, afeta qual é a primeira correspondência entre muitas correspondências, mas o conjunto de correspondências não muda. Nesse sentido, o conjunto de cadeias correspondentes a uma regex não muda, independentemente de você usar quantificadores gananciosos comuns ou quantificadores relutantes.
fonte
a+
ea+?
não são equivalentes neste sentido:aaaa
não é páreo para este último.abbb
não está em L (a*(..)*
) porque a primeira correspondência da stringabbb
com o regexa*(..)*
éabb
. Essa não é a definição padrão do idioma reconhecido por uma expressão regular. Se é realmente nisso que você está interessado, você deve dar um nome diferente.a+?
combinaaaaa
. Eu sei que o Regypes Ruby faz."aaaa" =~ /a?/
retornar true em Ruby, mas isso ocorre porque o padrão corresponde a uma subcadeia de caracteresaaaa
, não porque correspondeaaaa
.+
(editado) e Ruby parece coincidir com a palavra inteira (cf rubular.com).