模式匹配Scala中的正则表达式数组

时间:2017-07-08 20:54:12

标签: arrays regex scala pattern-matching

我在Scala中有一组正则表达式,我正在尝试验证邮件正文包含正则表达式中的任何内容。但是,在messageBody变量中我得到Pattern type is incompatible with given type, expected Array[Regex], found Array[String]。我怎样才能传递正确的案例?

其他一些帖子建议使用Pattern,但这在我的案例中没有用。

  val messageBody: Array[String] = message.body.split(' ')
  val unsubscribeTriggers: Array[Regex] = Array("unsubscribe/i".r, "stop/i".r, "stopall/i".r, "cancel/i".r, "end/i".r, "quit/i".r)\

  if (messageBody.length == 1) {
        unsubscribeTriggers match {
          case `messageBody` => true

          case _ => false

        }
}

3 个答案:

答案 0 :(得分:1)

这将告诉您任何正则表达式模式是否与massageBody数组中的第一个元素匹配。

unsubscribeTriggers.exists(_.findAllIn(messageBody.head).nonEmpty)

但我不认为你的正则表达式模式符合你的要求。 /i扩展名是什么?如果你的意思是忽略大小写,那就不会。它也不是一种非常有效或Scala式的方式。而不是许多较小的正则表达式模式,将它们组合成一个单独的测试。

val unsubscribeTriggers: Array[String] =
  Array("unsubscribe/i", "stop/i", "stopall/i", "cancel.i", "end/i", "quit/i")
val TriggersRE = unsubscribeTriggers.mkString("(", "|", ")").r

messageBody.head match {
  case TriggersRE(_) => true
  case _ => false
}

<强>更新

如果你只需要比较字符串,忽略大小写,那就试试吧。

val unsubscribeTriggers: Array[String] =
  Array("unsubscribe", "stop", "stopall", "cancel", "end", "quit")

unsubscribeTriggers.exists(messageBody.head.equalsIgnoreCase)

如果您想测试massageBody中的任何元素是否与unsubscribeTriggers中的任何元素匹配,请尝试此操作。

unsubscribeTriggers.exists(t => messageBody.exists(t.equalsIgnoreCase))

答案 1 :(得分:1)

你期望编译器有太大的魔力。如果你有一组正则表达式,你必须检查每个元素:

val unsubscribeTriggers: Array[Regex] = Array("(?i)unsubscribe".r, "(?i)stop".r)

val body = "sToP"
val matchFound = unsubscribeTriggers.exists { p: Regex =>
 body match {
  case p() => true
  case _ => false
 }
}
println(matchFound)

通过在开头添加(?i)使正则表达式不区分大小写。试试吧。

答案 2 :(得分:0)

您也可以非常干净地匹配正则表达式中的各个变量。

val messageBody: Array[String] = message.body.split(' ')

val unsubscribe = "(?i)unsubscribe".r
val stop = "(?i)stop".r
val stopall = "(?i)stopall".r
val cancel = "(?i)cancel".r
val end = "(?i)end".r
val quit = "(?i)quit".r

val shouldUnsubscribe = messageBody.headOption.exists {
  case unsubscribe() => true
  case stop() => true
  case stopall() => true
  case cancel() => true
  case end() => true
  case quit() => true
  case _ => false
}