有以下 Ragel 正则表达式:
pri_repeat = ("<" [0-9]{1,5} ">");
sp = " ";
host_info = (((ascii - sp)+ - pri_repeat) >begin %on_host_info)
((pri_repeat){0,1} >on_host_info_pri_repeat_begin $!on_host_info_pri_repeat_error);
这里假设如果字符串包含表单的子字符串S = '<123'
,那么我们需要切换到消息将被捕获到该子字符串的状态S
。
以及以下 Ragel 动作:
action begin
{
val_begin = p;
cs_val_begin = cs;
}
action on_host_info
{
// ...
LOG_INFO(L, "`on_host_info` action [host_info = %s]", value.c_str());
}
action on_host_info_pri_repeat_begin
{
LOG_INFO(L, "`on_host_info_pri_repeat_begin` action [data = %s]",
std::string(p, pe - p).c_str());
}
action on_host_info_pri_repeat_error
{
LOG_INFO(L, "`on_host_info_pri_repeat_error` state [data = %s]",
std::string(p, pe - p).c_str());
fgoto host_info;
}
输入字符串:
"IKWMC71:03138808,msu=816688275211201112\n<13"
日志显示以下内容:
13:20:48.598170 [ntdec.syslog_v1_cli_parser] INFO: `on_host_info` action [host_info = IKWMC71:03138808,msu=816688275211201112
]
13:20:48.598180 [ntdec.syslog_v1_cli_parser] INFO: `on_host_info_pri_repeat_begin` action [data = <13]
13:20:48.598477 [ntdec.syslog_v1_cli_parser] INFO: `on_host_info` action [host_info = IKWMC71:03138808,msu=816688275211201112
<13]
13:20:48.598484 [ntdec.syslog_v1_cli_parser] INFO: `on_host_info_pri_repeat_begin` action [data = ]
13:20:48.598487 [ntdec.syslog_v1_cli_parser] INFO: `on_end` action: [is_hostname = 1, !host_info.hostname.empty = 1, message.value.size = 0]
13:20:48.598490 [ntdec.syslog_v1_cli_parser] INFO: `on_end` action: msg := move(host_info)
13:20:48.598492 [ntdec.syslog_v1_cli_parser] INFO: `on_eof` action
13:20:48.598495 [ntdec.syslog_v1_cli_parser] INFO: syslog_v1_cli_parser return status = 0
如您所见,在到达 substring 之后S
,FSM 再次返回到 action
on_host_info
。为什么?如何确保机器不返回on_host_info
?