2017-04-21 2 views
0
val strList = List("point+100", "point-100") 
val pattern = """\w+""".r 
println(strList.map(pattern.findAllIn(_).toList))``` 

tatsächlicher Ausgang: List (List (Punkt 100), List (Punkt, 100)) Erwartete Ausgabe: List (List (Punkt 100), List (Punkt, -100))scala regex aufzufüllen Daten mit Zeichen

Möchten Sie wissen, warum es nicht erwartete Ausgabe gibt und wie kann ich es erreichen ..?

+0

Hinzufügen ein weiteres Szenario strlist => "point100" erwartet o/p: List (List (Punkt 100), List (Punkt, -100), Liste (Punkt, 100)) –

Antwort

0

Sie nicht ausgegeben erwartet hast, weil +/- sind nicht Wortzeichen \w, du hast recht gespalten konnte, bevor +/- mit voraus aussehen (=?) Syntax in Ihrem Fall:

strList.map(_.split("(?=[+-])")) 
// res84: List[Array[String]] = List(Array(point, +100), Array(point, -100)) 

oder Sie können die +/- Zeichen vor \w+ hinzufügen und machen es optional in welcher Art und Weise wird es zusammen mit dem +/- Zeichen vor ihm ein Wort extrahieren, wenn es vorhanden ist:

val pattern = """[+-]?\w+""".r 
// pattern: scala.util.matching.Regex = [+-]?\w+ 

println(strList.map(pattern.findAllIn(_).toList)) 
// List(List(point, +100), List(point, -100)) 

Noch besser ist, können Sie +- nur vor Ziffern hinzu:

val strList = List("point+100", "point-100", "point100") 

val pattern = """[a-zA-Z]+|[+-]?\d+""".r 
// pattern: scala.util.matching.Regex = [a-zA-Z]+|[+-]?\d+ 

println(strList.map(pattern.findAllIn(_).toList)) 
// List(List(point, +100), List(point, -100), List(point, 100)) 
+0

Danke @Psidom. Mein Anwendungsfall hat viel komplexere Szenarien. Fügen wir einen weiteren Fall zu strList = "point100" hinzu, wobei erwartete Ausgabe List (Liste (Punkt, +100), Liste (Punkt, -100), Liste (Punkt, 100)) –

+0

Versuchen Sie die letzte Methode. Nicht sicher, welche komplexere Situation du hast. Aber wenn Ihre Strings aus Pattern * Buchstaben * + * Ziffern * mit optionalem Vorzeichen bestehen, sollte dies funktionieren. – Psidom