Scala没有完成匹配

时间:2015-06-26 13:25:46

标签: regex scala

我对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不是首选。

为了记录,我尝试使用大量帮助工具验证我的正则表达式,但它们似乎都表明我做了正确的事情。

1 个答案:

答案 0 :(得分:1)

regex101生成6个匹配捕获,因此您可以按如下方式更改模式匹配:

decoded match {
  case pattern(_, _, _, _, _, _) => log.info("OK")
  case _ => log.info("NOK :(")
}