什么是在CRLF分隔符上拆分字符串的最佳方法,但最后可能有不完整的消息(没有CRLF)?
buf1 = "msg1\r\nmsg2\nmsg3\r\nmsg_no_CRLF"
buf2 = "msg1\r\nmsg2\nmsg3\r\nmsg4\r\n"
a = buf1.scan(/.*\r?\n|.*/)
>>> ["msg1\r\n", "msg2\n", "msg3\r\n", "msg_no_CRLF", ""]
a = buf2.scan(/.*\r?\n|.*/)
>>> ["msg1\r\n", "msg2\n", "msg3\r\n", "msg4\r\n", ""]
我尝试为数组的最后一项获取空字符串或不完整的消息。
>>> ["msg1\r\n", "msg2\n", "msg3\r\n", "msg_no_CRLF"]
>>> buf1 = a.last # "" or "msg_no_CRLF"
编辑:我有这个方法:
def read
msgs = []
@buffer << @socket.read_nonblock(1024)
while @buffer.slice!(/(.*)\r?\n/)
msgs << $1
end
msgs
end
虽然有效但我尝试用扫描或拆分两行来做同样的事。
该方法必须返回一组完整的消息(每个CRLF之前的所有部分)。
@buffer = "msg1\r\nmsg2\r\n"
# Ok, return ["msg1", "msg2"] and @buffer is set to ""
@buffer = "msg1\r\nmsg2"
# incomplete msg2, return ["msg1"] and @buffer is set to "msg2" for the next read.
对不起我的英语,很难正确解释。
答案 0 :(得分:0)
切片的另一种可能性。
msgs = []
while buf1.slice!(/(.*?)\r?\n/)
msgs << $1
end
# msgs: ["msg1", "msg2", "msg3"]
# buf1: "msg_no_CRLF"
# msgs: ["msg1", "msg2", "msg3", "msg4"]
# buf2: ""
有什么想做这样的事情吗?
msgs = buf1.scan(//)
buf1 = msgs.pop
答案 1 :(得分:0)
我会使用类似的东西:
buf1 = "msg1\r\nmsg2\n\msg3\r\nmsg_no_CRLF"
buf2 = "msg1\r\nmsg2\n\msg3\r\nmsg4\r\n"
buf1.split(/([\r\n]+)/) # => ["msg1", "\r\n", "msg2", "\n", "msg3", "\r\n", "msg_no_CRLF"]
buf2.split(/([\r\n]+)/) # => ["msg1", "\r\n", "msg2", "\n", "msg3", "\r\n", "msg4", "\r\n"]
buf1.split(/([\r\n]+)/).each_slice(2).map(&:join)
# => ["msg1\r\n", "msg2\n", "msg3\r\n", "msg_no_CRLF"]
buf2.split(/([\r\n]+)/).each_slice(2).map(&:join)
# => ["msg1\r\n", "msg2\n", "msg3\r\n", "msg4\r\n"]