k47.cz
foto Praha výběr povídky kulturatwitter FB


7. 6. 2011

Scala - Pattern matching a regulární výrazy 📷

       

Scala umožňuje pomocí pattern matchingu velice elegantně pracovat s regulárními výrazy.


Ukázka jednoduchého rozpoznání data:

val text = "2013-05-19"

val dateRegex = """(\d\d\d\d)-(\d\d)-(\d\d)""".r // vyrobí regex ze stringu, zkratka pro `new Regex(string)`
val dateRegex(year, month, day) = text           //

println("year: " + year + ", month: " + month + ", day: " + day)

Pozn:

- Počet nových proměnných na levé straně se musí shodovat s počtem uzávorkovaných skupin
- V regexu musí být aspoň jedna uzávorkovaná skupina
- Regex musí odpovídat celému testovanému stringu

Pokud chcete používat regexy výše uvedeným způsobem v přiřazení, musíte si být jisti, že nastane shoda, jinak bude vyvolána výjimka scala.MatchError. Když tohle nemůžete zajistit, musíte použít regulární pattern matching:

text match {
  case dateRegex(year, month, day) => println("year: " + year + ", month: " + month + ", day" + day)
  case _ => println("no date")
}

Regexy a pattern matching je možné efektivně použít v kombinaci s for expression:

val dates = Array("2001-01-01", "2002-02-02", "2003-03-03", "2010/10/10")
for ( dateRegex(year, month, day) <- dates ) yield (year.toInt, month.toInt, day.toInt)

Pole stringů je takto přetransformováno na pole tuplů (Int, Int, Int), které obsahují rok, měsíc a den. Navíc jsou všechny vstupní řetězce, které neodpovídají regexu, odfiltrovány pryč.


Více info + další možnosti použití regexů zde:

- http://daily-scala.blogspot.com/2010/01/regular-expression-1-basics-and.html
- http://daily-scala.blogspot.com/2010/01/regular-expression-2-rest-regex-class.html
- http://daily-scala.blogspot.com/2010/01/regular-expression-3-regex-matching.html
- http://ikaisays.com/2009/04/04/using-pattern-matching-with-regular-expressions-in-scala/


vstoupit do diskuze    sdílet na facebooku, twitteru, google+

publikováno 7. 6. 2011

příbuzné články:
Ceylon Project
Go třídy ve Scale 📷
Scala - články 📷
Scala - trait Dynamic 📷
Kompozice monád & Option 📷
ScalaQuery 📷

píše k47 & NEVERYOUNG, kontakt: ascii@k47.cz