1

我正在尝试使用 fparsec 解析 RFC 2822,但我无法处理多行的标题:(它与下一个标题混淆):这是我最好的尝试:你有什么提示吗?

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 期待 \t:Delivered-To: adfasdf@aasdfas.afa.com

4

1 回答 1

2

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

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

这现在产生:

成功:[("返回路径", "<ewrwe@werw.com>werwe"); (“送达”、“adfasdf@aasdfas.afa.com”)]

于 2017-04-11T11:40:56.670 回答