首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rfc2822解析多个标头行

rfc2822解析多个标头行
EN

Stack Overflow用户
提问于 2017-04-11 09:46:51
回答 1查看 73关注 0票数 1

我试图使用fparsec解析RFC 2822,但是我无法处理多行标题:(它会与下一个标题混淆):下面是我的最佳尝试:您有任何提示吗?

代码语言:javascript
复制
let str (s:string) = pstring s

let stringLiteral =
    manySatisfy (fun c -> c <> ':' && c <> '\r' && c <> '\n')

let ws = many (pchar ' ')

let keyValueSimple  =  stringLiteral .>>. (ws >>. str ":" >>. ws >>. stringLiteral) .>>. pchar '\n' |>> (fun (a,b) -> a)

let lineValue = ws >>. stringLiteral .>>. (pchar '\n' .>>. ( pchar '\t')) |>> ( fun (a,b) -> a )

let lastValue = ws >>. stringLiteral .>>. (pchar '\n' .>> notFollowedBy ( pchar '\t') ) |>> ( fun (a,b) -> a )

let keyValueComplex =  stringLiteral .>>. (ws >>. pchar ':') .>>. (many lineValue) .>>. lastValue |>> ( fun (((f),d),b) -> (f,f) )                     

let headers = many1 (keyValueComplex)

let parse (fileName:string) = 
    test headers "Return-Path: <ewrwe@werw.com>\n\twerwe\nDelivered-To: adfasdf@aasdfas.afa.com\n "

我期待3,1:交付到: adfasdf@aasdfas.afa.com

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-11 11:40:56

没关系,看起来我需要回溯(使用尝试),以便解析器不总是期望一个\t,而是寻找下一个标头。

设keyValueComplex = stringLiteral .>>.(ws >>. )pchar ':') .>>.(许多(尝试lineValue)) .>>。lastValue |>> (g,h)),d),b) -> (g,(Seq.fold (+)“d) + b) )

这现在产生了:

成功:(“返回路径”,"werwe");(“交付-到”,"adfasdf@aasdfas.afa.com")

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43342393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档