Pattern matching in Scala allows values to be matched against multiple cases like a switch statement. It can match primitives, strings, case classes, tuples, and types. For-expressions iterate over collections and can include generators to drive iteration, filters to control it, and definitions of local values. They yield a resulting collection rather than using loops.