2016-05-26 11 views
1

Ich versuche, ausMulti einfangenden Gruppen in scala regex

val s: String = "sometextHere[a][b][c]" 

zu

val x = "sometextHere" 
val y = List("a", "b", "c") 

Die Anzahl der "[...]" zu gehen, ist 1+. Ich habe etwas ziemlich hacky bekam, aber ich fühle mich wie es eine bessere Lösung

sein muss
val bracketMatcher = "\\[(\\w+)\\]".r 
val listMatcher = s"^(\\w+)((?:$bracketMatcher)+)".r 

listMatcher.findAllIn(chunk) match { 
     case matchIterator if matchIterator.hasNext => 
     val matchData = matchIterator.matchData.next() 
     val indexesMatch = bracketMatcher.findAllIn(matchData.group(2)).matchData.flatMap(_.subgroups).toList 
     val a = matchData.group(1) // This is "sometextHere" 
     val b = indexesMatch // This is List("a", "b", "c") 
     case _ => ... 
+0

Dies hat ein Potenzial, wirklich chaotisch zu werden. Was passiert, wenn Sie eine ungerade Anzahl von Klammern und/oder in der falschen Reihenfolge und/oder an verschiedenen Stellen des Strings haben. dh 'val s: String =" einige [[d] x [e]]] [[textHier [a] [b] [c] "' –

+0

Guter Punkt, aber in diesem Fall bin ich nur an Fällen interessiert, die übereinstimmen Genau dieses Muster, alles was komplexer ist (geschachtelte Klammern usw.) sollte nicht übereinstimmen. – user1498572

Antwort

1

Regexes sind leichter in dreifachen Anführungszeichen zu schreiben. Außerdem müssen Sie nicht die gesamte Sache auf einmal zusammenpassen:

Robert gab eine gute Warnung, obwohl. Stellen Sie sicher, dass Ihre Eingabedaten nicht verschachtelt sind oder dass Sie mit regulären Ausdrücken nicht umgehen können. Wenn Sie verschachteln, müssen Sie einen geeigneten Parser verwenden.

+0

Das sieht ein bisschen besser aus, ich nehme es dank! – user1498572