当尝试将以下正则表达式应用于列表中的每个元素(测试)时,出现错误。这就是我要在ghci中做的事
import Text.Regex.TDFA
let test = ["<lobbying_firm>The CrisCom Company</lobbying_firm>","<registration_year>2013</registration_year>"]
let regExp = "\\>(.)*\\<"
let result = map (=~ regExp :: String) test
我该怎么做?有什么想法吗?
答案 0 :(得分:2)
您非常亲密。唯一的问题是您的类型签名将在此处产生一些麻烦。您想要的(=~ rexExp)
的类型可能是String -> String
。实际上,映射函数的类型是一个以String
作为参数,并在此处返回String
的函数。不是String
本身。
我们可以这样创建一个map
:
result = map ((=~ regExp) :: String -> String) test
这将产生:
Prelude Text.Regex.TDFA> map ((=~ regExp) :: String -> String) test
[">The CrisCom Company</",">2013</"]
话虽这么说,我强烈建议不用正则表达式解析HTML,XML,JSON等。实际上,regexes can not parse HTML和其他递归语言。这是Pumping lemma for regular languages [wiki]的结果。您永远无法完全解析HTML。您可能确实解析了一些子语言,等等。但是即使这样,正则表达式也很容易变得(非常)复杂。因此,最好使用tagsoup
[hackage]之类的库,或scalpel
[hackage]之类的刮板库。