2017-07-08 3 views
0

Ich habe ein Array von Regex in Scala, und versuche zu überprüfen, dass ein Nachrichtentext alles in der Regex enthält. In der Variablen messageBody bekomme ich jedoch eine Pattern type is incompatible with given type, expected Array[Regex], found Array[String]. Wie kann ich einen richtigen Fall einreichen?Muster passen ein Array von Regex in Scala

Ein paar andere Beiträge haben vorgeschlagen, Pattern zu verwenden, aber das hat in meinem Fall nicht funktioniert.

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

Müssen Sie diese tatsächlich in einem Array sein. Oder kann das durch getrennte Variablen? –

+0

sie können separate Variablen sein – Rafa

Antwort

1

Sie erwarten zu viel Magie vom Compiler. Wenn Sie eine Sammlung von regulären Ausdrücken haben, haben Sie sich gegen jedes Element zu überprüfen:

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 wird Groß- und Kleinschreibung von (?i) am Anfang hinzugefügt wird. Versuch es.

1

Dies wird Ihnen sagen, wenn eine der Regex Muster das erste Element in dem Array massageBody entsprechen.

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

Aber ich glaube nicht, dass Ihre Regex-Muster tun, was Sie wollen. Was ist die /i Erweiterung? Wenn Sie meinen, es zu ignorieren, wird es nicht. Es ist auch kein sehr effizienter oder Scala-artiger Weg, es zu tun. Anstelle vieler kleinerer Regex-Muster kombinieren Sie sie zu einem einzigen 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 
} 

Update

Wenn Sie nur Zeichenfolgen vergleichen müssen, Fall zu ignorieren, dann ist dies versuchen.

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

unsubscribeTriggers.exists(messageBody.head.equalsIgnoreCase) 

Wenn Sie, wenn irgendein Element in massageBody Streichhölzern jedes Element in unsubscribeTriggers testen wollen, dann ist dies versuchen.

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

ja, die '/ i' soll Fall ignorieren. Wird es in meinem Fall? – Rafa

+0

Nein. Siehe mein Update. – jwvh

0

Sie können auf Regex einzelne Variablen ziemlich sauber auch anpassen.

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 
}