O problema
Não há uma maneira fácil de obter uma permutação com um regex.
- Permutação: Obtendo uma palavra ("aabc") para outra ordem, sem alterar o número ou o tipo de letras.
- Regex: expressão regular.
Para verificação:
- "Permutações de regex sem repetição" A resposta cria código JavaScript em vez de regex, assumindo que isso seria mais simples.
- "Como encontrar todas as permutações de uma determinada palavra em um determinado texto" - A resposta também não usa expressões regulares.
- "Regex para corresponder a todos os {1, 2, 3, 4} sem repetição" - A resposta usa regexes, mas não é adaptável nem simples.
- Essa resposta ainda afirma: "Uma expressão regular não pode fazer o que você está pedindo. Não pode gerar permutações a partir de uma string" .
O tipo de solução que estou procurando
Deve ter a forma:
- »Aabc« (ou qualquer outra coisa que você possa usar entre parênteses de abertura e fechamento)
- (aabc)! (semelhante a (abc)? mas com outro símbolo no final)
- [aabc]! (semelhante a [abc] + mas com outro símbolo no final)
Vantagens dessas soluções
Eles são:
- fácil
- adaptável
- reutilizável
Por que isso deveria existir?
- Regexes são uma maneira de descrever uma gramática de um idioma comum. Eles têm todo o poder de ser qualquer tipo de linguagem comum.
- Digamos que linguagens regulares são poderosas o suficiente para permutações (prova abaixo) - por que não há uma maneira fácil de expressar isso?
Então, minha pergunta é:
- (Por que) Minha prova está errada?
- Se estiver certo: por que não há maneira fácil de expressar permutações?
A prova
- Expressões regulares são uma maneira de observar a gramática de um idioma regular. Eles podem descrever qualquer gramática de idiomas comum.
- Outra maneira de descrever qualquer gramática regular (com um número finito de letras no alfabeto) são os autômatos não determinísticos (com um número finito de estados).
Tendo um número finito de letras, posso criar este autômato: (Exemplo. Formal: veja abaixo)
Gramática que aceita permutações de "abbc":
(procure por números no topo, talvez alguém saiba como melhorar esta parte)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (sem erro de digitação!)
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h --² bb
h²² -> ac
h²² -> ca
h²³ -> ab
h²³ -> ba
Mais formal: (usando um autômato de estado finito, mas isso também pode ser feito com gramática)
- Uma palavra q (com comprimento finito) para a qual qualquer permutação deve atingir um estado de aceitação.
- X é o alfabeto finito.
- O conjunto de estados S contém qualquer ordem de letras até o comprimento de q. (Portanto, o tamanho de S é finito.) Mais um estado de "qualquer palavra mais longa".
- função de transição de estado d que pega uma letra e se move no estado que corresponde à parte da palavra agora lida.
- F é um conjunto de estados que são permutações exatas de q.
Portanto, é possível criar um autômato de estado finito para aceitar permutações de uma determinada palavra.
Seguindo em frente com a prova
Então, eu provei que as línguas comuns têm o poder de verificar permutações, não tenho?
Então, por que não há uma abordagem para alcançar isso com os Regexes? É uma funcionalidade útil.
^(a()|a()|b()|c()){4}\2\3\4\5$
parece funcionar (consulte regex101.com/r/9URPpg/4/tests ).