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:
- 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ů tady, tady, tady a tady.