我在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
}
}
答案 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
}