我对Scala相对较新,我尝试做一些基本的正则表达式模式匹配:
在下面的示例中,我尝试匹配发送给Akka TCP actor的字符串:
class ConnectionHandler extends Actor with ActorLogging {
import Tcp._
def receive = {
case Received(data) => {
log.info("Data received! " + data)
log.info("Date received! " + data.decodeString("UTF-8"))
val pattern = """(?ms)(<START>>)(((.+?)=(.+?));)+(END)""".r
val decoded = data.decodeString("UTF-8").trim
decoded match {
case pattern() => log.info("OK")
case pattern(t) => log.info("A bit")
case _ => log.info("NOK :(")
}
pattern findFirstIn decoded match {
case Some(v) => log.info("Found: " + v); true
case None => log.info("Not found") ; false
}
}
case PeerClosed => {
log.info("Peer closed!")
context stop self
}
case _ => log.info("Received unknown message")
}
}
以下是我收到的示例字符串:
<START>>=ITM_NT_Logical_Disk;source='ITM';sub_source='Primary:PX810001999:NT';cms_hostname='pc120003350';cms_port='3661';integration_type='N';master_reset_flag='';appl_label='';situation_name='Y_WINDOWS_TEST';situation_type='S;Total_Size=152617~';END
据我所知,我的正则表达式应该可行,但不可否认的是,我并不擅长它们。
奇怪的是这部分的结果
decoded match {
case pattern() => log.info("OK")
case pattern(t) => log.info("A bit")
case _ => log.info("NOK :(")
}
是NOK,但这部分的结果是:
pattern findFirstIn decoded match {
case Some(v) => log.info("Found: " + v); true
case None => log.info("Not found") ; false
}
是它不仅找到一个值,而且它匹配整个精确的字符串。 (&#39; v&#39;的值正好是通过网络发送的字符串的值,或者是&#39;解码后的字符串&#39;)
起初我认为在字符串末尾附加的换行符会导致问题,但我添加了
val decoded = data.decodeString("UTF-8").trim
但没有运气:(
我也试过将Regex简化为
val pattern = """(?ms)(<START>>).*?(END)""".r
但这似乎并没有改善我的结果。
我想确保字符串与&#34; END&#34;完全结束,因为我之后需要进行一些操作,所以findFirstIn
不是首选。
为了记录,我尝试使用大量帮助工具验证我的正则表达式,但它们似乎都表明我做了正确的事情。
答案 0 :(得分:1)
由regex101生成6个匹配捕获,因此您可以按如下方式更改模式匹配:
decoded match {
case pattern(_, _, _, _, _, _) => log.info("OK")
case _ => log.info("NOK :(")
}