J'ai récemment discuté avec un ami d'un site Web qui proposait des défis d'expression régulière, correspondant principalement à un groupe de mots avec une propriété spéciale. Il cherchait une expression régulière qui correspond à des chaînes comme ||||||||
où le nombre de |
est premier. Je lui ai immédiatement dit que ça ne marcherait jamais car si une telle langue était régulière, la traduction du pompage du lemme donnerait le fait que pour une prime assez grand, il existe tel que est primordial pour tous , et bien ce n'est probablement pas du tout le cas (répartition des nombres premiers, trivialité d'une telle propriété inconnue et écrasante, ...)
Mais quelqu'un est venu avec la solution: NON CORRESPONDANCE (||+?)\1+
Cette expression tente de faire correspondre le groupe de capture (qui peut être ||
, |||
, ||||
et ainsi de suite deoccurrences de |
)fois. S'il correspond, cela signifie que le nombre représenté par la chaîne est divisible par, et n'est donc pas premier. Sinon, ça l'est.
Et je me sentais stupide, car il est devenu évident que le regroupement et la référence arrière permettent aux expressions rationnelles d'être en réalité beaucoup plus expressives que ... l'expression régulière, au sens théorique. Maintenant, ils ont même ajouté des lookarounds et d'autres opérateurs que je ne connaissais pas quand je faisais de la regex réelle.
Selon Wikipedia, il est encore plus expressif que les langages générés par une grammaire sans contexte. Voici donc ma question :
- pouvons-nous représenter n'importe quel langage algébrique (généré à partir d'une grammaire sans contexte) avec des moteurs d'expression régulière modernes
- y a-t-il une description plus générale, ou au moins une limite supérieure sur la complexité de quel type de langues peut être décrit par une expression rationnelle moderne?
Plus pragmatiquement, y a-t-il une théorie sérieuse derrière ou ajoutons-nous simplement de nouvelles fonctionnalités telles qu'elles viennent chaque fois qu'elles semblent implémentables au bloc initial d'expressions régulières réelles basées sur des automates finis?
Je sais que «l'expression rationnelle moderne» n'est pas très spécifique alors que la question l'est, mais je veux dire au moins avec des références inverses, et peut-être plus. Bien sûr, si vous avez des réponses partielles en supposant certaines restrictions sur ce langage "regex moderne", n'hésitez pas à le poster.
la source
Réponses:
Le problème de mots des expressions régulières avec références arrières est NP-complet; citant Aho (1990) via Blaisorblade / Charles Stewart .
Je ne connais pas l'ensemble des opérateurs que certaines versions de regexps possèdent, mais plusieurs ne sont pas plus puissants que les standards ; ils ont probablement été ajoutés comme sucre syntaxique.
la source