Expressivité des expressions régulières modernes

9

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 primep assez grand, il existe kp tel que p+nk est primordial pour tous n1, 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 dek2occurrences de |)n2fois. S'il correspond, cela signifie que le nombre représenté par la chaîne est divisible park, 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.

yago
la source
1
Question connexe . Je semble me souvenir qu'au moins certaines saveurs RegExp sont complètes. Cet article peut être un point de départ valable pour la recherche documentaire.
Raphael
@Raphael merci beaucoup, l'article semble répondre à une grande partie de mes interrogations
yago
Une raison plus forte pour laquelle tous les p + nk ne peuvent pas être premiers est que lorsque n = p, vous avez p + nk = p (1 + k).
Nathan FD du

Réponses: