2016-10-17 3 views
4

Das mag offensichtlich aussehen, aber ich konnte die No match available error nicht erklären. Im Folgenden finden Sie eine Definition einer einfachen Matching-Funktion, die ich verwende.Wie benutze ich scala.util.matching.Regex richtig?

Die gleichen Anweisungen innerhalb der Funktion werden ohne Problem ausgeführt, der Aufruf der Funktion löst jedoch den Fehler aus. Kannst du mir helfen, den Fehler zu lokalisieren?

import scala.util.matching.Regex 

def regexParsing(inputRecord:String, inputRegex:String, listOfFields:Seq[String], fieldsToRemove:Seq[String]): scala.collection.Map[String,Any] = { 
    val logPattern = new Regex(inputRegex, listOfFields:_*) 
    val result = logPattern.findAllIn(inputRecord) 
    val resultMap = result.groupNames.map(a => Map(a.toString -> result.group(a))).reduce(_++_) 
    return resultMap 
} 

val inputRecord = """s2222f""" 
val inputRegex = """(.*)""" 
val listOfFields = Seq("field") 
val fieldsToRemove = Seq("field1", "field2") 

// working 
val logPattern = new Regex(inputRegex, listOfFields:_*) 
val result = logPattern.findAllIn(inputRecord) 
val resultMap = result.groupNames.map(a => Map(a.toString -> result.group(a))).reduce(_++_) 

// not working 
regexParsing(inputRecord, inputRegex, listOfFields, fieldsToRemove) 
+1

Ich bekomme den gleichen Fehler in beiden Code-Blöcken (in oder aus der Methode) - sehr seltsam. Sieht aus wie ein Problem beim Zugriff auf 'result.group (..)', bevor der Match-Iterator irgendwie materialisiert wird - wenn Sie etwas Dummes wie 'println (result)' hinzufügen, bevor Sie 'resultMap' erstellen, funktioniert das (!). –

+1

@TzachZohar Ja, es gibt einen alten Mailinglisten-Thread, bei dem jemand bemerkt hat, dass er in REPL arbeitet, weil REPL toString aufruft. –

Antwort

3

Versuchen Sie 2.12? Die Einschränkung, dass der Iterator weiterentwickelt wird, ist ein Fehler in der API, der schließlich behoben wurde.

$ scala 
Welcome to Scala 2.12.0-RC1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101). 
Type in expressions for evaluation. Or try :help. 

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

import scala.util.matching.Regex 

def regexParsing(inputRecord:String, inputRegex:String, listOfFields:Seq[String], fieldsToRemove:Seq[String]): scala.collection.Map[String,Any] = { 
    val logPattern = new Regex(inputRegex, listOfFields:_*) 
    val result = logPattern.findAllIn(inputRecord) 
    val resultMap = result.groupNames.map(a => Map(a.toString -> result.group(a))).reduce(_++_) 
    return resultMap 
} 

val inputRecord = """s2222f""" 
val inputRegex = """(.*)""" 
val listOfFields = Seq("field") 
val fieldsToRemove = Seq("field1", "field2") 

// working 
val logPattern = new Regex(inputRegex, listOfFields:_*) 
val result = logPattern.findAllIn(inputRecord) 
val resultMap = result.groupNames.map(a => Map(a.toString -> result.group(a))).reduce(_++_) 

// Exiting paste mode, now interpreting. 

import scala.util.matching.Regex 
regexParsing: (inputRecord: String, inputRegex: String, listOfFields: Seq[String], fieldsToRemove: Seq[String])scala.collection.Map[String,Any] 
inputRecord: String = s2222f 
inputRegex: String = (.*) 
listOfFields: Seq[String] = List(field) 
fieldsToRemove: Seq[String] = List(field1, field2) 
logPattern: scala.util.matching.Regex = (.*) 
result: scala.util.matching.Regex.MatchIterator = non-empty iterator 
resultMap: scala.collection.immutable.Map[String,String] = Map(field -> s2222f) 

scala> regexParsing(inputRecord, inputRegex, listOfFields, fieldsToRemove) 
res0: scala.collection.Map[String,Any] = Map(field -> s2222f) 

scala> :quit 
+1

Dieser: https://github.com/scala/scala/pull/5261 –