PCRE in Haskell-quoi, où, comment?

j'ai cherché de la documentation ou un tutoriel sur les expressions régulières de Haskell depuis des lustres. Il n'y a pas d'information utile sur le haskellwiki page. Il donne simplement le message énigmatique:

Documentation
Coming soonish.

Il y a une brève blog que j'ai trouvé assez utile, cependant il ne traite que des expressions régulières Posix, pas PCRE.

je travaille avec Posix regex depuis quelques semaines et j'arrive à la conclusion que pour mon tâche J'ai besoin de PCRE.

mon problème est que je ne sais pas par où commencer avec PCRE à Haskell. J'ai téléchargé regex-pcre-builtin avec cabal mais j'ai besoin d'un exemple d'un programme simple d'appariement pour m'aider à aller de l'avant.

  • Est-il possible de mettre en œuvre multi-ligne correspondant?
  • puis-je obtenir les matches dans ce format: [(MatchOffset,MatchLength)]?
  • quels autres formats Est-ce que je peux récupérer les allumettes?

je vous Remercie beaucoup pour toute aide!

17
demandé sur Nick Brunt 2011-10-25 02:00:03

5 réponses

Eh bien, j'ai écrit une grande partie de la page wiki et j'ai pu écrire "Coming soonish". Le paquet regex-pcre était mon enveloppement de PCRE en utilisant l'interface regex-base, où regex-base est utilisé comme interface pour plusieurs moteurs d'expression réguliers très différents. Le paquet pcre-light de Don Stewart n'a pas cette couche d'abstraction et est donc beaucoup plus petit.

Le blog sur le Texte.Regex.Posix utilise mon paquet regex-posix qui se trouve également sur regex-base. Ainsi, l'utilisation de regex-pcre sera très similaire à ce billet de blog, sauf que les options de compilation et d'exécution de PCRE seront différentes.

pour configurer regex-pcre le Texte.Regex.PCRE.Envelopper le module a les constantes dont vous avez besoin. Utilisez makeRegexOptsM à partir d'expressions régulières de base pour spécifier les options.

5
répondu Chris Kuklewicz 2011-10-25 09:33:50

il y a deux options principales quand vous voulez utiliser des regexes PCRE-style dans Haskell:

  • regex-pcre utilise la même interface que décrit dans ce billet de blog (et aussi dans RWH, comme je le pense une version étendue de ce blog), ce qui peut éventuellement être étendu avec pcre-moins. regex-pcre-builtin semble être un pré-lancement instantané et ne devrait probablement pas être utiliser.

  • pcre-lumière est relié à la bibliothèque PCRE. Il ne fournit pas les types de retour que vous recherchez, juste tous les matchings (s'il y en a). cependant, le pcre-la lumière-les extras paquet fournit un MatchResult classe, pour lesquels vous pourriez être en mesure de fournir une telle instance. Cela peut être amélioré à l'aide de regexqq qui vous permet d'utiliser la quasi-citation pour vous assurer que votre modèle regex vérifie le type; cependant, il ne fonctionne pas avec GHC-7 (et à moins que quelqu'un prenne en charge son maintien, il ne fonctionnera pas).

donc, en supposant que vous allez avec regex-pcre:

  • Selon répondre, oui.

  • je pense que oui, via le MatchArray type (il renvoie un tableau, dans lequel vous pouvez ensuite extraire la liste).

  • Voir ici pour tous les résultats possibles d'un regex.

10
répondu ivanm 2017-05-23 12:17:23

Il y a aussi regex-applicative que j'ai écrit.

L'idée est que vous pouvez attribuer un sens à chaque morceau d'une expression régulière et ensuite les composer, tout comme vous écrivez des parsers en utilisant Parsec.

voici un exemple -- simple analyse D'URL.

import Text.Regex.Applicative

data Protocol = HTTP | FTP deriving Show

protocol :: RE Char Protocol
protocol = HTTP <$ string "http" <|> FTP <$ string "ftp"

type Host = String
type Location = String
data URL = URL Protocol Host Location deriving Show

host :: RE Char Host
host = many $ psym $ (/= '/')

url :: RE Char URL
url = URL <$> protocol <* string "://" <*> host <* sym '/' <*> many anySym

main = print $ "http://stackoverflow.com/questions" =~ url
9
répondu Roman Cheplyaka 2015-03-28 16:27:50

regexpr est un autre PCRE-ish lib qui est multiplate-forme et rapide pour commencer.

5
répondu Simon Michael 2011-10-24 23:13:42

j'ai trouver rex pour être tout à fait sympa aussi, son ViewPatterns l'intégration est une bonne idée je pense.

cela peut être verbeux, mais cela est en partie lié au concept regex.

parseDate :: String -> LocalTime
parseDate [rex|(?{read -> year}\d+)-(?{read -> month}\d+)-
        (?{read -> day}\d+)\s(?{read -> hour}\d+):(?{read -> mins}\d+):
        (?{read -> sec}\d+)|] =
    LocalTime (fromGregorian year month day) (TimeOfDay hour mins sec)
parseDate v@_ = error $ "invalid date " ++ v

cela dit, je viens de découvrir regex-applicative mentionné dans l'une des autres réponses et il peut être un meilleur choix, pourrait être moins verbeux et plus idiomatique, bien que rex a essentiellement zéro courbe d'apprentissage si vous connaissez des expressions régulières qui peuvent être un plus.

2
répondu Emmanuel Touzery 2014-02-14 14:42:25