我目前正在使用 Netty。现在的问题是,我想从缓冲区中检索特定的字符串。例如,如果缓冲区数据如下:
8=FIX.4.2|9=00815|35=W|49=TT_PRICE|56=SAP0094X|10=134|8=FIX.4.2|9=00816|35=W49=TT_PRICE|56=SAP0094X|10=121
现在我想要以“8=xxx”开头并以“10=xxx”结尾的字符串。您可以清楚地看到我们在缓冲区中附加了两个字符串。请注意,上述数据位于字节数组中。因此,有时我会得到确切的字符串,有时我会得到该字符串和附加的完整字符串的另一半。我想要的是,如何获得从“8=xxx”到“10=xxx”的确切字符串。我在 Netty 中看到过 DelimiterBasedFrameDecoder 类,它只是检查指定的分隔符并为我们提供字符串。以同样的方式我该如何做到这一点?
最佳答案
我的建议是翻译缓冲区并使用正则表达式来匹配您的目标子字符串:
ByteBuffer bb = /* byte buffer */
String text = new String(bb.array(), 0, bb.position(), bb.remaing(), Charset.defaultCharset());
// I assume that this is the string: "8=FIX.4.2|9=00815|35=W|49=TT_PRICE|56=SAP0094X|10=134|8=FIX.4.2|9=00816|35=W49=TT_PRICE|56=SAP0094X|10=121"
// If you need info on the regex just ask for it
Pattern r = Pattern.compile("(8=\\w\\w\\w)[\\s\\S]*?(10=\\w\\w\\w)");
Matcher m = r.matcher(text);
while (m.find()) {
System.out.println(m.group());
}
请注意,Charset.defaultCharset()
可以根据 ByteArray 使用的编码进行更改
关于java - 如何从Netty JAVA中的连续缓冲区/字节数组中获取特定的字符串模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45615733/