如何在 switch case 模式语句中使用 Swift 文字正则表达式?

l -*_*c l 7 regex switch-statement swift swift5.7

如何在 switch case 模式语句中使用 Swift 文字正则表达式?

根据 WWDC 2022 演示幻灯片中的示例,以下内容预计可以编译并运行正常:

import Foundation
import RegexBuilder

switch "abc" {
    case /\w+/:
        print("matched!")
    default:
        print("not matched.")
}
Run Code Online (Sandbox Code Playgroud)

但是,会产生以下错误:

类型的表达式模式Regex<Substring>无法匹配类型的值String

是否可以switch case通过某种方式修改带有 Swift 正则表达式文字表达式的语句以使其正常运行?如何在 switch case 模式语句中使用新的 Swift 5.7 正则表达式功能?

Swe*_*per 8

据我发现,“与语句中的正则switch表达式匹配”功能尚未实现,因为人们在争论确切的语义应该是什么。如果是这样的情况

switch "---abc---" {
case /\w+/:
    print("foo")
default:
    print("bar")
}
Run Code Online (Sandbox Code Playgroud)

switch 语句应该运行哪个分支?仅当整个字符串与正则表达式匹配时才算作匹配,还是仅当切换字符串的子字符串匹配时才算匹配?换句话说,是wholeMatch还是firstMatch请参阅此处的更多讨论。

最终他们也没有得出结论,

该提案经过修改后已被接受(修改~=暂时是子集化)。

因此,~=没有为 添加运算符Regex<Output>,因此您不能在 switch 中使用它。

如果您愿意,您可以自己添加它,如果您可以在两种语义之间做出决定:)例如:

func ~=(regex: Regex<Substring>, str: String) -> Bool {
    // errors count as "not match"
    (try? regex.wholeMatch(in: str)) != nil
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,定义您自己的“~=”不会在以后产生错误,因为重载解析有利于标准库外部定义的操作而不是标准库中定义的操作。然而,对于阅读您的源代码的开发人员来说,这可能会导致_混乱_。 (5认同)