Java 正在解析正则表达式中日志文件中的修复协议消息?

Java 正在解析正则表达式中日志文件中的修复协议消息?,java,regex,pattern-matching,fix-protocol,Java,Regex,Pattern Matching,Fix Protocol,我需要从一个大日志文件中提取所有修复消息,该文件可能包含10000到20000条修复协议消息。我希望获取的修复协议消息将以8=FIX开头,以|10=一些校验和值结尾,这些校验和值可以是任何值,然后后跟分隔符“|” e、 7.g.8=FIXT.1.1.1 9=4.4=4.4=7.4=4.4四四四四四=4.4=4.4=再FiFixuat 1244=52=20140402-12-11:11:38:38:34 124编码>8=8=8=8.1.1.1.1.1.1.1 7 7 7 7 7 7.1.1.1.1

我需要从一个大日志文件中提取所有修复消息,该文件可能包含10000到20000条修复协议消息。我希望获取的修复协议消息将以
8=FIX
开头,以
|10=
一些校验和值结尾,这些校验和值可以是任何值,然后后跟分隔符
“|”

e、 7.g.<编码>8=FIXT.1.1.1 9=4.4=4.4=7.4=4.4四四四四四=4.4=4.4=再FiFixuat 1244=52=20140402-12-11:11:38:38:34 124编码>8=8=8=8.1.1.1.1.1.1.1 7 7 7 7 7 7.1.1.1.1.1.1.4=4=4=4=4=4=4 4 4=4=4 4 4 4 4=4=4.4.4 4=4=4 4=4=4.4.4=4.4=4.4=4=4=4.0 0 0 0.0 0 0 0 0 0.00 0.00万0=55=55=55=英镑/美元/美元/英镑/英镑/英镑/英镑/英镑/美元12400 0 0 0 0 0 0 0 0 0 0 0 0 0.7654 | 195=0.0012 | 460=4 | 571=7852455 | 1003=210月24日,37=20140402-12:12:12:48 4040; 10月24日)10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10月10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10| 80=50000000.00 | 5967=88330000.00 | 10=111 |

目前,我对正则表达式使用这种模式

Pattern=Pattern.compile(“8=FIX(.*10=(.*?))”

但在上面的模式中,我只能提取消息直到
10=
,而不能提取校验和值,并且可能存在一种场景,其中一些固定消息自定义标记类似于8410=TEST,如下所示:

8=FIXT.1.1 | 9=73 | 35=0 | 34=560 | 49=RTNSFIXUAT | 8410=TEST | 52=20140403-01:50:21 | 56=TR | UAT |速度| 1128=8 | 10=206 |

在上面,我会得到这个值

“8=FIXT.1.1 | 9=73 | 35=0 | 34=560 | 49=RTNSFIXUAT | 84”(X-我想要完整的消息,直到标记10校验和值206)

请按如下方式查找日志文件片段:

>02-04-14 11:38:33.559|QFJ Message Processor|input/REPOFIXInput1|INFO|quickfix.outgoing: 8=FIXT.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT|10=147|
02-04-14 11:38:34.713|SocketConnectorIoProcessor-1.0|input/REPOFIXInput1|INFO|quickfix.incoming: 8=FIXT.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD|10=111|
02-04-14 11:38:35.004|QFJ Message Processor|input/REPOFIXInput1|INFO|Received FIX application message: 8=FIXT.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|10=111|

如果我理解正确,您希望保留:

  • 8=FIX
    之后但在
    |10=…
    之前的所有内容
  • 还有
    |10=值|
下面是一个例子:

String input = ">02-04-14 11:38:33.559|QFJ Message Processor|input/REPOFIXInput1|INFO|quickfix.outgoing: 8=FIXT.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT|10=147|\r\n"
                       + "02-04-14 11:38:34.713|SocketConnectorIoProcessor-1.0|input/REPOFIXInput1|INFO|quickfix.incoming: 8=FIXT.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD|10=111|\r\n"
                       + "02-04-14 11:38:35.004|QFJ Message Processor|input/REPOFIXInput1|INFO|Received FIX application message: 8=FIXT.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|10=111|";
    Pattern p = Pattern.compile("8=FIX(.+)(?<=\\|)10=(.+?)(?=\\|)", Pattern.MULTILINE);
    Matcher m = p.matcher(input);
    while (m.find()) {
        System.out.println(m.group());
        System.out.println("\t" + m.group(1));
        System.out.println("\t" + m.group(2));
    }
注释

  • 此示例未进行性能优化
  • 您可能希望删除此
    模式的“多行”标志,并使用常量
    模式分别处理每一行
  • 如果这样做,您将不得不为每行重新初始化
    匹配器
    ,但您可能可以在
    If
    语句中调用
    find
    ,而不是
    while
    语句,假设每行有一个日志
  • 存储匹配的值取决于您

所以,一旦修复消息被“处理”,最好将它们持久化到数据库中,并避免所有这一切。

我理解我在修复消息中使用
“|”(pipe)
作为分隔符的问题,但它也出现在日志注释中(
02-04-14:30:45.139 | QFJ定时器|输入/固定输入1 |信息|发送固定会话消息:8=FIXT.1.1 | 9=71 | 35=0 | 34=2072 | 49=UAT | 52=20140402-14:30:45.139 | 56=FIXUAT | 10=140|

02-04-14 14:30:45.141 | QFJ Timer | input/FIXInput1 | DEBUG | FIX message as XML:
)直到
10=checksum
结束时才处理该模式,现在在我的上述模式中,在FIX message标记与
“~(tilde)
之间设置了分隔符,即'8=FIX(.?)(?感谢Mena,上面的示例方法对我有效,但如果我通过日志文件进行处理,它不会给出结果。我相信这是由于
\r\n
您已明确添加到上面的代码中,用于模式匹配。此外,正如我在问题中所写的,我需要处理文件中的10到20K修复消息。因此,在本文中在这种情况下,我需要写'm.group(),m.group(1),m.group(2)`直到20K。请在上面给出建议。Regards@Ankit如注释中所述,所需的
模式
可能没有多行标志(只需将其删除)正如您将逐行处理您的文件一样。还提到:存储匹配的值取决于您,无论您是将其放入文件、数据库还是(由于大小的原因,风险更大)将它们存储在内存中。正如您所看到的,您只需要组1和组2;主组是整个匹配项。再次感谢您,但到目前为止,我并不关心保存这些消息。使用上述正则表达式,我仍然无法从日志中获得预期的消息(可能是我遗漏了什么),但我尝试了
8=FIX(.*)(?使用NIX系统中可用的
cut
命令,或在windows上的cygwin中使用该命令。可能需要2分钟的作业。数据库将比写入文件慢得多。是的,因此请使用message broker完成工作,然后保存此处所需的报告。
8=FIXT.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT|10=147
    T.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT|
    147
8=FIXT.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD|10=111
    T.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD|
    111
8=FIXT.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|10=111
    T.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|
    111