scalabeginner

Regex Pattern Matching

Use regex with Scala pattern matching: extractors, findAll, replaceAll, and named groups.

scala
import scala.util.matching.Regex

@main def run(): Unit =
  // Basic regex
  val emailPattern = """([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})""".r
  val phonePattern = """\((\d{3})\)\s?(\d{3})-(\d{4})""".r
  val ipPattern = """(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})""".r

  // Pattern matching with regex extractors
  "alice@example.com" match
    case emailPattern(local, domain) =>
      println(s"Local: $local, Domain: $domain")
    case _ => println("No match")

  // Find all matches
  val text = "Contact alice@test.com or bob@example.org for info"
  val emails = emailPattern.findAllIn(text).toList
  println(s"Emails: $emails")

  // Find with groups
  val matches = emailPattern.findAllMatchIn(text).toList
  matches.foreach { m =>
    println(s"  ${m.group(1)} @ ${m.group(2)}")
  }

  // Replace
  val masked = emailPattern.replaceAllIn(text, "[REDACTED]")
  println(s"Masked: $masked")

  // Replace with function
  val obscured = emailPattern.replaceAllIn(text, m =>
    s"${m.group(1).take(1)}***@${m.group(2)}")
  println(s"Obscured: $obscured")

  // IP validation
  def isValidIP(s: String): Boolean = s match
    case ipPattern(a, b, c, d) =>
      List(a, b, c, d).map(_.toInt).forall(n => n >= 0 && n <= 255)
    case _ => false

  println(s"\n192.168.1.1 valid: ${isValidIP("192.168.1.1")}")
  println(s"999.1.1.1 valid: ${isValidIP("999.1.1.1")}")

  // Named groups
  val datePattern = """(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})""".r
  "2024-06-15" match
    case datePattern(y, m, d) => println(s"\nDate: $y/$m/$d")
    case _ => ()

  // Split with regex
  val csv = "apple, banana ,  cherry,  date"
  val items = csv.split("""\s*,\s*""").toList
  println(s"Items: $items")

  // Unanchored regex (match anywhere)
  val word = """\b[A-Z][a-z]+\b""".r.unanchored
  "hello World foo Bar" match
    case word() => println("Contains capitalized word")
    case _ => println("No capitalized word")

  // Log parser
  val logPattern = """(\d{4}-\d{2}-\d{2}) (\w+): (.+)""".r
  val logs = List(
    "2024-06-15 ERROR: Connection timeout",
    "2024-06-15 INFO: Server started",
    "2024-06-15 WARN: High memory usage"
  )
  logs.foreach {
    case logPattern(date, level, msg) =>
      println(s"  [$level] $date - $msg")
    case line => println(s"  Unparsed: $line")
  }

Use Cases

  • Text parsing and validation
  • Log file analysis
  • Data extraction from strings

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.