2017-07-08 1 views
0

J'ai un tableau de regex dans Scala, et j'essaie de vérifier qu'un corps de message contient quelque chose dans la regex. Cependant, dans la variable messageBody, j'obtiens un Pattern type is incompatible with given type, expected Array[Regex], found Array[String]. Comment puis-je passer dans un cas approprié?Modèle correspondant à un tableau de Regex dans Scala

Quelques autres messages ont suggéré d'utiliser Pattern mais cela n'a pas fonctionné dans mon cas.

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

Avez-vous réellement besoin de ceux-ci pour être dans un tableau. Ou peut le par des variables distinctes? –

+0

ils peuvent être des variables séparées – Rafa

Répondre

1

Vous attendez trop de magie du compilateur. Si vous avez une collection de regexes, vous devez vérifier vous-même contre tous les éléments:

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) 

Regex est fait insensible à la casse en ajoutant (?i) au début. Essayez-le.

1

Cela vous indiquera si l'un des motifs Regex correspondent au 1er élément du tableau massageBody.

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

Mais je ne pense pas que vos habitudes de regex faire ce que vous voulez. Qu'est-ce que c'est l'extension /i? Si vous voulez dire qu'il faut ignorer le cas, ce ne sera pas le cas. Ce n'est pas non plus un moyen très efficace ou Scala-esque de le faire. Au lieu de nombreux motifs regex plus petits, combinez-les en un seul test.

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 
} 

mise à jour

Si vous avez juste besoin de comparer des chaînes, en ignorant le cas, essayez cela.

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

unsubscribeTriggers.exists(messageBody.head.equalsIgnoreCase) 

Si vous voulez tester si tout élément en massageBody matchs tout élément dans unsubscribeTriggers puis essayer cela.

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

oui, le '/ i' est destiné à ignorer la casse. Est-ce que c'est dans mon cas? – Rafa

+0

Non. Voir ma mise à jour. – jwvh

0

Vous pouvez également faire correspondre les variables individuelles regex de façon très nette.

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 
}