0
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 的最后一个索引。

4

2 回答 2

1

您是否尝试反转整个字符串并选择 firstIndex?

就像是

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

于 2012-10-15T05:27:41.213 回答
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
}
于 2012-10-15T07:13:55.057 回答