Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex haskell正则代换_Regex_Haskell - Fatal编程技术网

Regex haskell正则代换

Regex haskell正则代换,regex,haskell,Regex,Haskell,尽管Haskell的正则表达式匹配引擎数量多得可笑,但我能找到的唯一替代引擎是Text.regex,它虽然不错,但缺少了一些我喜欢的pcre引擎。是否有任何基于pcre的软件包可以进行替换,或者我一直坚持这样做?regex base中的正则表达式API对于要匹配的字符容器是通用的。一般来说,为了实现替换而进行某种拼接是很难提高效率的。我不想提供一个蹩脚的通用例程 编写一个小函数来完全按照您想要的方式进行替换只是一个更好的主意,它可以编写为与您的容器相匹配。我不认为对于试图完成实际工作的人来说,“

尽管Haskell的正则表达式匹配引擎数量多得可笑,但我能找到的唯一替代引擎是
Text.regex
,它虽然不错,但缺少了一些我喜欢的pcre引擎。是否有任何基于pcre的软件包可以进行替换,或者我一直坚持这样做?

regex base中的正则表达式API对于要匹配的字符容器是通用的。一般来说,为了实现替换而进行某种拼接是很难提高效率的。我不想提供一个蹩脚的通用例程

编写一个小函数来完全按照您想要的方式进行替换只是一个更好的主意,它可以编写为与您的容器相匹配。

我不认为对于试图完成实际工作的人来说,“自己动手”是一个合理的答案,因为在这个领域,所有其他现代语言都有一个简单的方法来完成这项工作。包括计划。这里有一些实际的资源;我的代码来自一个项目,我试图用基于调用qq“方括号”中的函数的文本替换“qql-foo-bar-baz-qq”,原因是

最佳选择:pcre重型:

      let newBody = gsub [re|\s(qq[a-z]+)\s(.*?)\sqq\s|] (unWikiReplacer2 titles) body in do
[snip]
unWikiReplacer2 :: [String] -> String -> [String] -> String
unWikiReplacer2 titles match subList = case length subList > 0 of
        True -> " --" ++ subList!!1 ++ "-- "
        False -> match
请注意,pcre heavy直接支持基于功能的替换,具有任何 字符串类型。太好了

另一种选择:pcre灯,功能很小,但不完全有效 性能:

    let newBody = replaceAllPCRE "\\s(qq[a-z]+)\\s(.*?)\\sqq\\s" (unWikiReplacer titles) body in do
[snip]
unWikiReplacer :: [String] -> (PCRE.MatchResult String) -> String
unWikiReplacer titles mr = case length subList > 0 of
        True -> " --" ++ subList!!1 ++ "-- "
        False -> PCRE.mrMatch mr
    where
        subList = PCRE.mrSubList mr

-- A very simple, very dumb "replace all instances of this regex
-- with the results of this function" function.  Relies on the
-- MatchResult return type.
--
-- https://github.com/erantapaa/haskell-regexp-examples/blob/master/RegexExamples.hs
-- was very helpful to me in constructing this
--
-- I also used
-- https://github.com/jaspervdj/hakyll/blob/ea7d97498275a23fbda06e168904ee261f29594e/src/Hakyll/Core/Util/String.hs
replaceAllPCRE :: String              -- ^ Pattern
           -> ((PCRE.MatchResult String) -> String)  -- ^ Replacement (called on capture)
           -> String              -- ^ Source string
           -> String              -- ^ Result
replaceAllPCRE pattern f source =
    if (source PCRE.=~ pattern) == True then
      replaceAllPCRE pattern f newStr
    else
      source
    where
        mr = (source PCRE.=~ pattern)
        newStr = (PCRE.mrBefore mr) ++ (f mr) ++ (PCRE.mrAfter mr)
其他人的解决方案:

另一个,这次嵌入了一个主要的图书馆:

另一个用于此目的的软件包:

Update 2020 我完全同意鲍威尔的说法

我不认为“自己动手”是对那些试图完成实际工作的人的合理回答,因为在这个领域,所有其他现代语言都有一种简单的方法来完成这项工作

在撰写本文时,还有一种用于正则表达式替换的方法,尽管它与Perl不兼容


对于使用解析器而不是正则表达式进行模式匹配和替换,有一个很好的问题,我也遇到了同样的问题。好吧,算了吧,我根据
Text.regex.PCRE.Light
编写了自己的,尽管它很好地移植到了大多数其他实现中。如果它解决了问题,就把它作为答案发布。