2019 年的 Yesod 正则表达式

Yesod Regular Expressions in 2019

Yesod 经常使用 Text

我希望使用任何支持 UTF8 和 Text 的正则表达式库。

最推荐的两个库好像是:

正则表达式-tdfa 尝试:

import          Text.Regex.TDFA
...
let (parta,partb,partc) = ((sometext :: Text) =~ ("de" :: String)) :: (String, String, String)

我似乎无法使用 Text,尽管 regex-tdfa 似乎有一些用于 Text 的模块 http://hackage.haskell.org/package/regex-tdfa-1.3.1.0/docs/Text-Regex-TDFA-Text.html

stack 在此处安装的 regex-tdfa 版本是 regex-tdfa-1.2.3.1,出于某种原因,它不会使用具有上述 Text.Regex.TDFA.Text 的较新版本。当我尝试在 package.yaml 中指定版本 - regex-tdfa >=1.3.1 时,使用 "yesod devel":

构建时出现此错误
In the dependencies for example-0.0.0(+dev +library-only):
    regex-tdfa-1.2.3.1 from stack configuration does not match >=1.3.1 
needed since backend is a build target.

现有 SO 问题:此问题的答案已过时,regex-tdfa-text 已弃用:

如何使用支持 Text 的 regex-tdfa 版本?

使用 PCRE 的尝试:

import          Text.Regex.PCRE
...
let stringResult = ( "hello there" :: Text ) =~ ( "e" :: Text ) :: AllTextMatches [] Text

这不起作用,除非我用 String 替换所有 Text。 错误是:

  • No instance for (RegexMaker Regex CompOption ExecOption Text)
        arising from a use of ‘=~’
    • In the expression:
          ("hello there" :: Text) =~ ("e" :: Text) :: AllTextMatches [] Text

本教程声称 PCRE 适用于 UTF8:https://gabebw.com/blog/2015/10/11/regular-expressions-in-haskell

但我不确定 regex-pcre 是否声称可以与 Text 一起使用。我应该从 Text 转换为 String 然后使用 regex-pcre 吗?

总结:

在 Yesod 中使用正则表达式的最佳做法是什么?如何使用带有 Text 和 UTF8 的库?

在有关依赖项的错误消息之后,您应该会看到显示以下文本:

Some different approaches to resolving this:

  * Set 'allow-newer: true' in /u/buhr/.stack/config.yaml to ignore all version
    constraints and build anyway.

  * Recommended action: try adding the following to your extra-deps 
    .../yesodtest/stack.yaml:

- regex-tdfa-1.3.1.0@sha256:c77808a0d68d275c75fb84dc9ced340536574...

extra-deps 解决方案是首选方案。在您的项目特定 stack.yaml 中,添加:

extra-deps:
- regex-tdfa-1.3.1.0

(实际上并不需要详细的 SHA256。)这会引发另一个错误,因为 regex-base 太旧了,因此您还需要按照建议的操作添加它:

extra-deps:
- regex-tdfa-1.3.1.0
- regex-base-0.94.0.0

这足以让我使用 resolver: lts-14.17 构建 yesod/simple 模板。