在Rebol中解析此问题的最佳方法

时间:2011-04-30 00:00:37

标签: parsing rebol

如何从以下HTML中解析我的解析规则中噪音最小的交易收据日期时间? (我希望获得的输出是:“交易收据:04/28/2011 17:03:09”

 <FONT COLOR=DARKBLUE>Transaction Receipt </FONT></TH></TR><TR></TR><TR></TR><TR><TD COLSPAN=4 ALIGN=CENTER><FONT SIZE=-1 COLOR=DARKBLUE>04/28/2011 17:03:09</FONT>

以下作品但我没有感觉良好!保证在某个地方的交易收据之后有一个日期时间(虽然如果我做一个grep我不会做贪婪的比赛)

parse d [
    thru {<FONT COLOR=DARKBLUE>Transaction Receipt </FONT></TH></TR><TR></TR><TR></TR><TR><TD COLSPAN=4 ALIGN=CENTER><FONT SIZE=-1 COLOR=DARKBLUE>}
    copy t to "</FONT>"
    ]

2 个答案:

答案 0 :(得分:1)

这更短......

parse d [thru <FONT SIZE=-1 COLOR=DARKBLUE> copy t to </FONT>]

但并未专门寻找日期时间对。不幸的是,REBOL认为日期使用的是无效日期......

>> 04/28/2011
** Syntax Error: Invalid date -- 04/28/2011
** Near: (line 1) 04/28/2011

因此您无法专门搜索它。如果日期是28/04/2011(并且之后有一个空格,虽然为什么需要加载我不确定),以下情况会有效......

parse load d [to date! copy t to </FONT>]

嗯。试试这个......

t: ""
parse d [
    some [
        to "<" thru ">" mark: copy text to "<" (if text [append t text]) :mark
    ]
]

返回:“交易收据04/28/2011 17:03:09”

它的工作原理是跳过所有标签,附加任何留给t的文本。

希望有所帮助!

答案 1 :(得分:1)

与往常一样:如果格式一致,您可以随时尝试明确匹配日期:

rule: use [dg tag date value][
    tag: use [chars][
        chars: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9" " =-"]
        ["<" opt "/" some chars ">"]
    ]

    date: use [dg mo dy yr tm][
        dg: charset "0123456789"
        [
            copy mo [2 dg "/"] copy dy [2 dg "/"] copy yr 4 dg
            " " copy tm [2 dg ":" 2 dg ":" 2 dg]
            (value: load rejoin [dy mo yr "/" tm])
        ]
    ]

    [
        some [
              "Transaction Receipt" (probe "Transaction Receipt")
            | date (probe value)

            ; everything else
            | some " " | tag ; | skip ; will parse the whole doc...
        ]
    ]
]