How to use Swift literal regex expressions in switch case pattern statements?
Based on the examples from WWDC 2022 presention slides, the following is expected to compile and run OK:
import Foundation
import RegexBuilder
switch "abc" {
case /\w /:
print("matched!")
default:
print("not matched.")
}
However, the following error is produced:
Expression pattern of type
Regex<Substring>
cannot match values of typeString
Can the switch
case
statement with a Swift regex literal expression be somehow modified to function OK? How would one use the new Swift 5.7 regex capabilties in the switch case pattern statement?
CodePudding user response:
From what I have found, the "matching with regexes in switch
statement" feature has not been implemented, because people were arguing about what the exact semantic should be. In case such as
switch "---abc---" {
case /\w /:
print("foo")
default:
print("bar")
}
which branch should the switch statement run? Should it count as a match only if the whole string matches the regex, or is it enough only for a substring of the switched string to match? In other words, is it wholeMatch
or firstMatch
? See more of the discussion here.
In the end, they were not able to come to a conclusion, and
The proposal has been accepted with modifications (the modification being to subset out
~=
for now).
So the ~=
operator was not added for Regex<Output>
, so you cannot use it in a switch.
You can add it yourself if you want, if you can decide between the two semantics :) For example:
func ~=(regex: Regex<Substring>, str: String) -> Bool {
// errors count as "not match"
(try? regex.wholeMatch(in: str)) != nil
}