scalabeginner
Regex Pattern Matching
Use regex with Scala pattern matching: extractors, findAll, replaceAll, and named groups.
scalaPress ⌘/Ctrl + Shift + C to copy
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.
scalabeginner
Pattern Matching Fundamentals
Use Scala pattern matching with guards, type patterns, tuple patterns, and nested extractors.
Best for: Control flow with pattern matching
#scala#pattern-matching
scalabeginner
String Processing and Regex
Process strings with Scala regex, interpolation, pattern matching extractors, and common operations.
Best for: Text parsing and extraction
#scala#string
scalaadvanced
Advanced Pattern Matching Techniques
Master advanced patterns: custom extractors, unapply, variable binding, and deep matching.
Best for: Custom domain extractors
#scala#pattern-matching
scalabeginner
Enum Patterns and Exhaustive Matching
Define and use enums in Scala 3: values, parameters, methods, and exhaustive pattern matching.
Best for: Defining finite sets of values
#scala#enum