Le problème
Il n'y a pas de moyen facile d'obtenir une permutation avec une expression régulière.
- Permutation: obtenir un mot ("aabc") dans un autre ordre, sans changer le nombre ou le type de lettres.
- Regex: expression régulière.
Pour vérification:
- "Permutations d'expression régulière sans répétition" La réponse crée du code JavaScript au lieu d'une expression régulière, en supposant que ce serait plus simple.
- "Comment trouver toutes les permutations d'un mot donné dans un texte donné" - La réponse n'utilise pas non plus de regex.
- "Regex pour correspondre à tous les {1, 2, 3, 4} sans répétition" - La réponse utilise des regex, mais ce n'est ni adaptable ni simple.
- Cette réponse affirme même: "Une expression régulière ne peut pas faire ce que vous demandez. Elle ne peut pas générer de permutations à partir d'une chaîne" .
Le type de solution que je recherche
Il devrait avoir la forme:
- »Aabc« (ou toute autre chose que vous pourriez utiliser entre parenthèses ouvrantes et fermantes)
- (aabc)! (similaire à (abc)? mais avec un autre symbole à la fin)
- [aabc]! (similaire à [abc] + mais avec un autre symbole à la fin)
Avantages de ces solutions
Elles sont:
- facile
- adaptable
- réutilisable
Pourquoi cela devrait exister
- Les expressions régulières sont un moyen de décrire la grammaire d'une langue régulière. Ils ont le plein pouvoir d'être n'importe quel langage ordinaire.
- Disons que les langages réguliers sont assez puissants pour les permutations (preuve ci-dessous) - pourquoi n'y a-t-il pas de moyen facile d'exprimer cela?
Ma question est donc:
- (Pourquoi) Ma preuve est-elle fausse?
- Si c'est le cas: pourquoi n'y a-t-il pas de moyen facile d'exprimer des permutations?
La preuve
- Les expressions régulières sont un moyen de noter la grammaire d'une langue régulière. Ils peuvent décrire n'importe quelle grammaire de langues régulières.
- Les automates non déterministes (avec un nombre fini d'états) sont une autre façon de décrire les langages réguliers (qui ont un nombre fini de lettres dans leur alphabet).
Ayant un nombre fini de lettres je peux créer cet automate: (Exemple. Formel: voir ci-dessous)
Grammaire qui accepte les permutations de "abbc":
(essayez les chiffres en haut, peut-être que quelqu'un sait comment rendre cette partie plus belle)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (pas d'équivalence typo!)
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h¹² -> bb
h²² -> ac
h²² -> ca
h²³ -> ab
h²³ -> ba
Plus formel: (en utilisant un automate à états finis mais cela pourrait aussi être fait avec la grammaire)
- Un mot q (de longueur finie) auquel toute permutation devrait atteindre un état acceptant.
- X est l'alphabet fini.
- L'ensemble d'états S contient n'importe quel ordre de lettres jusqu'à la longueur de q. (La taille de S est donc finie.) Plus un état de "tout mot plus long".
- fonction de transition d'état d qui prend une lettre et se déplace sur l'état qui correspond à la partie maintenant lue du mot.
- F est un ensemble de ces états qui sont des permutations exactes de q.
Il est donc possible de créer un automate à états finis pour accepter les permutations d'un mot donné.
Passer à la preuve
J'ai donc prouvé que les langues régulières ont le pouvoir de vérifier les permutations, n'est-ce pas?
Alors, pourquoi n'y a-t-il pas d'approche pour y parvenir avec Regexes? C'est une fonctionnalité utile.
^(a()|a()|b()|c()){4}\2\3\4\5$
semble fonctionner (voir regex101.com/r/9URPpg/4/tests ).