Expressions régulières en C

Je suis curieux de savoir si quelqu’un connaît un bon moyen de faire correspondre l’expression régulière en C La seule façon dont je peux penser est par le biais de Flex. Est-ce le seul moyen ou existe-t-il un meilleur moyen?

Merci!

Euh … Le meilleur moyen est de

#include  

C’est l’ API standard POSIX pour les expressions régulières.

Pour les systèmes non-POSIX, rouler soi-même est une alternative, un moteur de regex de base n’est pas trop difficile à réaliser. Je suis sûr qu’il existe aussi des solutions sur étagère, je n’en ai pas trouvé une.

À bien y penser, je pense que glib en a un.

En fonction du dialecte que vous recherchez et de la plate-forme sur laquelle vous vous trouvez:

  • Les expressions régulières POSIX sont probablement dans la bibliothèque C standard – voir et regcomp, regerror, regexec, regfree.
  • libPCRE fournit la plupart des fonctionnalités de regex étendues de perl
  • glib a GRegex
  • La bibliothèque Tcl Regex de Henry Spencer .

Henry Spencer a également créé une autre bibliothèque regex , utilisée par les versions actuelles de TCL et PostgreSQL. Celui-ci est intéressant car il s’agit d’une implémentation hybride NFA / DFA.

Les expressions rationnelles qui acceptent la même chaîne de plusieurs manières (comme un * a?) Nécessitent de manière inhérente un NFA. La mise en œuvre habituelle modélise la NFA sous la forme d’une DFA utilisant le retour arrière, ce qui peut aller jusqu’à 0 (longueur égale à 2 ^ (entrée)) pour un motif particulièrement dégénéré. Cependant, la simple implémentation récursive peut être étendue avec la capture, les références arrières, les rappels au code et toutes les fonctionnalités “supplémentaires” habituelles offertes par de nombreuses langues en plus du test des correspondances.

L’approche “NFA” suit plusieurs états en cours et les met à jour pour chaque personnage entrant (pour plus d’explication, reportez-vous à la description fournie par Ross Cox des regex NFA de Thompson ). Cette approche est O (input.length * pattern.length), ce qui est plus rapide – immensément dans le pire des cas – mais ne peut pas effectuer de back-back ou de capture car elle ne garde pas la trace de la manière dont il est arrivé à un état.

L’approche de Spencer est hybride, compilant certaines parties d’un modèle selon l’approche NFA et n’utilisant le retour arrière que lorsque cela est nécessaire pour les captures réellement demandées. C’est souvent une victoire substantielle (voir la position de TCL dans la fusillade regex-adn ).

Regardez ceci: http://www.pcre.org/

C’est une très belle bibliothèque!

Une approche complètement différente consiste à essayer une grammaire d’expression syntaxique (PEG) . Un PEG pose le problème de correspondance de modèle du sharepoint vue d’un parsingur et peut même tirer parti de plusieurs règles formant une grammaire complète. Cela permet d’écrire des expressions qui correspondent à des parenthèses équilibrées, qui sont par ailleurs assez difficiles à exprimer dans la plupart des dialectes d’expression rationnelle.

Bien que les PEG soient relativement nouveaux, il devrait y avoir quelques implémentations utilisables à partir de C.

L’implémentation PEG que j’ai personnellement utilisée est LPeg . Il est parfaitement lié à Lua et a été écrit par hasard par l’un des principaux auteurs de Lua, Roberto Ierusalimschy. Il fournit une implémentation complète du PEG et inclut également un adaptateur qui convertit une expression rationnelle en un PEG équivalent pour l’exécution.

Lier le kernel Lua à un programme C juste pour avoir access à LPeg peut sembler excessif, mais ce ne serait pas si difficile à faire, même si vous n’aviez pas l’intention d’utiliser Lua à d’autres fins.

Peut – être que cet article aidera? Il vous montre comment utiliser les fonctions regex définies dans regex.h .

Oui, le posix regex n’est-il pas merveilleux, ils ont tout, alors je me suis demandé pourquoi ils ne sont pas en C? Eh bien, j’ai trouvé la réponse et je suis heureux, ils sont là, et voici comment les utiliser

Booster le REGEX