Lud*_*igH 5 regex unicode haskell
我有一个Unicode文件,其中包含MediaText标记中的(瑞典)维基百科文章。我想清除所有标记。在某些情况下,我想从标记标签中提取文本,例如超链接的链接标题(如简化的wikiextractor)。
我的方法是在文件上运行一组正则表达式以删除标记。在链接示例中,我需要替换[[link]]为link。只要文本不包含Unicode字符(例如),我就可以使用正则表达式很好地解决此问题ö。
我尝试过的示例:
ghci> :m +Data.Text
ghci> subRegex (mkRegex "\\[\\[([() a-zA-Z]*)\\]\\]") "Se mer om [[Stockholm]]" "\\1"
"Se mer om Stockholm"
ghci> subRegex (mkRegex "\\[\\[([() a-zA-Z]*)\\]\\]") "Se mer om [[Göteborg]]" "\\1"
"Se mer om [[G\246teborg]]"
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?如何使正则表达式引擎意识到这ö确实是一个普通字母(至少在瑞典语中如此)?
编辑:
问题似乎并不真正存在于模式中,而是在引擎中。如果我允许除q链接文本之外的所有字符,则ö可以允许。但是不是...
ghci> subRegex (mkRegex "\\[\\[([^q]*)\\]\\]") "[[Goteborg]]" "\\1"
"Goteborg"
ghci> subRegex (mkRegex "\\[\\[([^q]*)\\]\\]") "[[Göteborg]]" "\\1"
"[[G\246teborg]]"
ghci> subRegex (mkRegex "ö") "ö" "q"
"q"
ghci> subRegex (mkRegex "[ö]") "ö" "q"
"\246"
Run Code Online (Sandbox Code Playgroud)
使用字符类时,该问题似乎特别出现。它ö本身就可以匹配。
我现在决定按照作者写的这个SO 答案中的建议使用 Text.Regex.PCRE.Heavy 。它解决了我的问题。
\n\n因此,解决方案变为
\n\nGHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help\nPrelude> :m Text.Regex.PCRE.Heavy\nPrelude Text.Regex.PCRE.Heavy> :set -XFlexibleContexts\nPrelude Text.Regex.PCRE.Heavy> :set -XQuasiQuotes\nPrelude Text.Regex.PCRE.Heavy> gsub [re|\\[\\[([^\\]]*)\\]\\]|] (\\(firstMatch:_) -> firstMatch :: String) "[[G\xc3\xb6teborg]]" :: String\n"G\\246teborg"\nRun Code Online (Sandbox Code Playgroud)\n\n不幸的是,我仍然不知道为什么 POSIX 后端不能处理这个问题,但 PCRE 后端可以。
\n| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |