k47.cz    — každý den dokud se vám to nezačne líbit
foto Praha výběr povídky kultura | twitter FB


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

7. 6. 2011 — k47 (CC by)

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:

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:

píše k47 & hosté, ascii@k47.cz