假设我有一个无限的东西列表.在这个列表中,我有时会有一些东西表明隐藏的消息即将开始,然后是消息长度,crc,然后是结束令牌.然后列表继续,在某处,会出现一条新消息:
a :: b :: start :: 3 :: 1 :: 2 :: 3 :: 4FAA :: end :: x :: y :: z :: ....
将这种模式匹配到以下结构的最惯用(使用匹配,我认为?)是什么?
size = 3 payload = 1 :: 2 :: 3 crc = 4FAA
另外,考虑到令牌“start”可能出现在有效载荷内部,因此必须依赖“完全匹配”.
解决方法
使用解析器组合器.你的确切解决方案似乎是解析令牌,但为了简化,我假设你只是在阅读一系列用空格分隔的单词.
object P extends scala.util.parsing.combinator.RegexParsers { def message: Parser[Any] = properMessage | dummy ~> message def properMessage = start ~> body <~ end def start = "(?i)start".r def end = "(?i)end".r def body = (size >> payload) ~ crc def crc = word def size = "\\d+".r ^^ (_.toInt) def payload = repN(_: Int,word) def word = "\\S+".r def dummy = word }
并且,使用它:
scala> val stream = "a b start 3 1 2 3 4FAA end x y z " stream: String = "a b start 3 1 2 3 4FAA end x y z " scala> P.parse(P.message,stream) res5: P.ParseResult[Any] = [1.35] parsed: (List(1,2,3)~4FAA)
现在,RegexParsers解析了Char的流.由于您有一个令牌流,因此StandardTokenParsers可能是更适合的类.或者您可以将其基于解析器,并将Elem定义为适合您的需求.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。