You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在可解析标准格式电子邮件地址的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 组合实现轻量解析,仅处理常见的 显示名称<邮箱地址> 格式:

  1. 依赖声明(cabal配置):
build-depends: 
  base >= 4.14 && < 5,
  text,
  attoparsec,
  email-validate,
  mime-mail
  1. 实现代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:11