分析器消息解析

时间:2012-10-15 05:23:26

标签: java ftp

H|\^&|||DiaMed|CM v3.0||||||||20100510124259
P|1|10-001|4000011||Black^Carol|White|19670521|F||
O|1||4000011^^^\^^^|^^^MO01B|R|||||||||||||3||||20100510122212|||F
R|1|^^^AntiA^MO01B^Bloodgroup: ABO/D+ DAT (DiaClon) (5049)|0|C||||R||IH-
----------------------------------------
------------------------------------------
L|1|N

我收到了来自FTP服务器的Analyzer下载消息。如何确定它是完整的消息。 H表示消息的第一个字符,L表示传输会话的结束。我可以获得指示H的消息的第一个索引 但是如何从L | 1 | N中获得指示L的最后一个索引。

2 个答案:

答案 0 :(得分:1)

您是否尝试撤消整个字符串并选择firstIndex?

这样的东西

int index = ((new StringBuffer(inputStirng)).reverse().toString()).indexOf('L'); index = inputString.length() - (index + 1);
您需要从String长度中减去subatract以获得实际索引

答案 1 :(得分:0)

您可以将所有行加入1个字符串。然后在DOTALL模式下应用以下正则表达式:^ H(。+?)L \ | 1 \ | N $

在下面的示例中,我使用Groovy,主要是因为它允许定义多行字符串。除此之外,它应该直接转换为Java。

import java.util.regex.*

def s = """H|\\^&|||DiaMed|CM v3.0||||||||20100510124259
P|1|10-001|4000011||Black^Carol|White|19670521|F||
O|1||4000011^^^\\^^^|^^^MO01B|R|||||||||||||3||||20100510122212|||F
R|1|^^^AntiA^MO01B^Bloodgroup: ABO/D+ DAT (DiaClon) (5049)|0|C||||R||IH-
----------------------------------------
------------------------------------------
L|1|N"""

String regex = '^H(.+?)L\\|1\\|N$'

Pattern p = Pattern.compile(regex, Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find()) {
  String text = m.group(1);
  println text
}