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

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

7. 6. 2011 — k47 (CC by)

Scala umož­ňuje pomocí pat­tern matchingu velice ele­gantně pra­co­vat s re­gu­lár­ními výrazy.


Ukázka jed­no­du­chého roz­po­zná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 po­u­ží­vat regexy výše uve­de­ným způ­so­bem v při­řa­zení, musíte si být jisti, že na­stane shoda, jinak bude vy­vo­lána vý­jimka scala.MatchError. Když tohle ne­mů­žete za­jis­tit, musíte použít re­gu­lární pat­tern matching:

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

Regexy a pat­tern matching je možné efek­tivně použít v kom­bi­naci s for ex­pres­sion:

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ře­trans­for­mo­váno na pole tuplů (Int, Int, Int), které ob­sa­hují rok, měsíc a den. Navíc jsou všechny vstupní ře­tězce, které ne­od­po­ví­dají regexu, od­fil­tro­vány pryč.


Více info + další mož­nosti po­u­žití regexů zde:

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