是否存在可解析标准格式电子邮件地址的Haskell函数?
Haskell 标准格式电子邮件地址解析方案
你要的带显示名称的RFC标准邮件地址解析,可以通过以下两种方式实现:
方案1:使用现成的第三方包
直接使用 rfc5322 包的内置解析器,它完整兼容RFC 5322邮件格式规范,可直接解析出符合要求的地址结构:
- 首先添加
rfc5322、mime-mail、text到项目依赖 - 调用示例:
import Data.RFC5322.Address (parseAddress) import Network.Mail.Mime (Address) -- 直接调用即可得到预期结果 parseEmailAddress :: String -> Maybe Address parseEmailAddress = parseAddress
执行效果完全匹配你的需求:
> parseEmailAddress "Jon Doe<jon.doe@mail.com>" Just (Address (Just "Jon Doe") "jon.doe@mail.com")
方案2:轻量自定义实现
如果你不想引入过重的RFC完整解析依赖,可以基于 attoparsec + email-validate 组合实现轻量解析,仅处理常见的 显示名称<邮箱地址> 格式:
- 依赖声明(cabal配置):
build-depends: base >= 4.14 && < 5, text, attoparsec, email-validate, mime-mail
- 实现代码:
import qualified Data.Text as T import Data.Attoparsec.Text (Parser, parseOnly, many1, noneOf, char, optional, skipSpace) import Text.Email.Validate (isValid) import Network.Mail.Mime (Address(..)) parseEmailAddress :: T.Text -> Either String Address parseEmailAddress = parseOnly addrParser where addrParser :: Parser Address addrParser = do skipSpace displayName <- optional $ T.strip . T.pack <$> many1 (noneOf "<") <* char '<' email <- T.pack <$> many1 (noneOf ">") <* char '>' skipSpace if isValid email then pure $ Address displayName email else fail "非法邮箱地址格式"
注意:如果只需要解析纯邮箱地址(不带显示名称),直接用
email-validate包的parseEmail函数即可,不需要额外写解析逻辑。
内容的提问来源于stack exchange,提问作者Microtribute
相关产品推荐
相关产品推荐

