Parsing 在解析中匹配自定义标记

Parsing 在解析中匹配自定义标记,parsing,rebol,rebol3,Parsing,Rebol,Rebol3,我正在研究一个字符串转换问题。要求如下: line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)} ==> line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', to_date('2014-10-09 11:40:4

我正在研究一个字符串转换问题。要求如下:

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)}

==> 

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', to_date('2014-10-09 11:40:44', 'yyyy-mm-dd hh24:mi:ss'), '', '105210', null)}
:将
'2014-10-09 11:40:44'
转换为
至日期('2014-10-09 11:40:44','yyyy-mm dd hh24:mi:ss')

我的代码如下所示:

date: use [digit][
    digit: charset "0123456789"
    [4 digit "-" 2 digit "-" 2 digit space 2 digit ":" 2 digit ":" 2 digit]
]
parse line [ to date to end]
但我有一个错误:

** Script error: PARSE - invalid rule or usage of rule: digit
** Where: parse do either either either -apply-
** Near: parse line [to date to end]
我做了一些测试:

probe parse "SSS 2016-01-01 00:00:00" [thru 3 "S" space date to end] ;true
probe parse "SSS 2016-01-01 00:00:00" [ to date to end]  ; the error above

由于
date
值在我的所有数据集中的位置都不相同,我如何才能找到它并匹配它并进行相应的更改?

到和通过历来不允许任意规则作为其参数。见:

“由于非常重要的性能原因,TO和THRU的语法目前受到设计的限制…”

这是我的。因此,例如,以下内容将在那里起作用:

parse "aabbaabbaabbccc" [
    thru [
       some "a" (prin "a") some "b" (prin "b") some "c" (prin "c")
    ]
]
然而,它的产出是:

abababababc
这表明它没有比在每一步迭代地“天真地”应用解析规则更好的答案。循环解析引擎的效率不如原子化地运行TO/THRU,因为存在更快的搜索方法(例如,基本字符串搜索)。括号中代码的重复执行可能与实际意图不符


不过……还是让它来吧。然后让用户担心他们的代码何时会变慢,如果有必要,可以对其进行性能调优。因此,Rebol在这方面很有可能与Red一致,并允许任意规则。

我通过一种间接的方式:

date: use [digit][
    digit: charset "0123456789"
    [4 digit "-" 2 digit "-" 2 digit space 2 digit ":" 2 digit ":" 2 digit]
]

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)}

parse line [
    thru "(" vals: (
        blk: parse/all vals ","
        foreach val blk [
            if parse val [" '" date "'"][
                ;probe val
                replace line val rejoin [ { to_date(} at val 2 {, 'yyyy-mm-dd hh24:mi:ss')}]
            ]
        ]
    )
    to end
    (probe line)
]
输出:

{INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', to_date('2014-10-09 11:40:44', 'yyyy-mm-dd hh24:mi:ss'), '', '105210', null)}
我的做法如下:

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)}

d: [2 digit]
parse/all line [some [p1: {'} 4 digit "-" d "-" d " " d ":" d ":" d {'} p2: (insert p2 ")" insert p1 "to_date(" ) | skip]]

>> {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC??', 'B', 'admin', to_date('2014-10-09 11:40:44'), '', '105210', null)}

这里有一个真正的Rebol2解决方案

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC??', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)}
date: use [digit space][
     space: " "
     digit: charset "0123456789"
     [4 digit "-" 2 digit "-" 2 digit space 2 digit ":" 2 digit ":" 2 digit]
]

>> parse/all line [ some [ [da: "'" date   (insert da  "to_date (" )   11 skip  de:   (insert  de " 'yyyy-mm-dd hh24:mi:ss'), ") ]  | skip ] ]
== true
>> probe line
{INSERT INTO `pub_company` VALUES ('1', '0', 'ABC??', 'B', 'admin', to_date ('2014-10-09 11:40:44', 'yyyy-mm-dd hh24:mi:ss'),  '', '105210', null)}

你好,霍斯蒂尔福克,谢谢你的解释。我知道原因。我是通过间接的方式做到的。