Haskell中的PCRE - 什么,在哪里,如何?

Nic*_*unt 17 regex pcre haskell

我一直在寻找一些关于Haskell正则表达式的文档或教程.HaskellWiki页面上没有有用的信息.它只是给出了一个神秘的信息:

Documentation
Coming soonish.
Run Code Online (Sandbox Code Playgroud)

有一篇简短的博客文章,我发现它非常有用,但它只处理Posix正则表达式,而不是PCRE.

我一直在使用POSIX正则表达式的几个星期,我来,对于我的任务,我需要PCRE的结论.

我的问题是我不知道在Haskell中从哪里开始使用PCRE.我已经下载regex-pcre-builtin了cabal,但我需要一个简单匹配程序例子来帮助我开始.

  • 是否可以实现多行匹配?
  • 我可以用这种格式取回比赛:[(MatchOffset,MatchLength)]
  • 还有哪些其他格式可以让比赛重新开始?

非常感谢您的帮助!

Rom*_*aka 11

还有我写过的正则表达式 - 适用性.

我们的想法是,您可以为正则表达式的每个部分分配一些含义,然后组合它们,就像使用Parsec编写解析器一样.

这是一个例子 - 简单的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
Run Code Online (Sandbox Code Playgroud)


iva*_*anm 10

想要在Haskell中使用PCRE样式的正则表达式时有两个主要选项:

  • regex-pcre使用与该博客文章中描述的相同的界面(以及RWH,因为我认为该博客文章的扩展版本); 这可以选择性地延长pcre-less. regex-pcre-builtin似乎是这个的预发布快照,可能不应该使用.

  • pcre-light绑定到PCRE库.它不提供您所追求的返回类型,只提供所有匹配(如果有). 但是,pcre-light-extras包提供了一个MatchResult类,您可以为其提供这样的实例.这可以使用regexqq进行增强,它允许您使用准引用来确保您的正则表达式模式类型检查; 但是,它不适用于GHC-7(除非有人接管维护它,否则它不会).

所以,假设你选择regex-pcre:

  • 根据这个答案,是的.

  • 我想是这样的,通过MatchArray类型(它返回一个数组,然后你可以从中获取列表).

  • 请参阅此处,了解正则表达式的所有可能结果.


Sim*_*ael 5

regexpr是另一个PCRE-ish lib,它是跨平台的,可以快速入门.


Chr*_*icz 5

好吧,我写了很多维基页面,可能写了"即将推出".regex-pcre包是我使用regex-base接口包装PCRE,其中regex-base用作几个非常不同的正则表达式引擎后端的接口.Don Stewart的pcre-light包没有这个抽象层,因此更小.

Text.Regex.Posix上的博客帖子使用我的regex-posix包,它也在regex-base之上.因此,除了PCRE的编译和执行选项不同之外,regex-pcre的使用将与该博客文章非常相似.

对于配置regex-pcre,Text.Regex.PCRE.Wrap模块具有您需要的常量.使用regex-base中的makeRegexOptsM指定选项.