k47.cz
mastodon twitter RSS
bandcamp explorer

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

7. 6. 2011 (před 11 lety) — 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ů tady, tady, tadytady.

píše k47, ascii@k47.cz