如何在Switch Case模式语句中使用SWIFT文字正则表达式?

基于WWDC 2022演示文稿幻灯片中的示例,预计可以编译并运行以下代码:

import Foundation
import RegexBuilder

switch "abc" {
    case /\w+/:
        print("matched!")
    default:
        print("not matched.")
}

但是,会产生以下错误:

类型Regex<Substring>的表达式模式不能与类型String的值匹配

可以以某种方式修改带有SWIFT正则表达式的switch case语句以使其运行正常吗?如何在Switch Case Pattern语句中使用新的SWIFT 5.7正则表达式功能?

推荐答案

据我所知,"与switch条语句中的正则表达式匹配"功能还没有实现,因为人们一直在争论确切的语义应该是什么.在以下情况下

switch "---abc---" {
case /\w+/:
    print("foo")
default:
    print("bar")
}

Switch语句应该运行哪个分支?是否应仅在整个字符串与正则表达式匹配时才将其视为匹配,或者仅对已切换字符串的子字符串进行匹配就足够了吗?换句话说,是wholeMatch还是firstMatch?请参阅更多讨论here.

最后,他们无法得出结论,

该提案经修改后已被接受(修改内容为现在列出~=个小项).

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

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

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

Swift相关问答推荐

如何将泛型函数存储到变量中?

如何在visionOS上删除PhotosPicker背景 colored颜色 ?

如何设置两个不同的视图模型以在我的SwiftUI应用程序中使用相同的数据源?

我在SwiftUI中的动画无法正常工作

从任务中打印

文件命名&NumberForMatter+扩展名&:含义?

可选,类似于自定义类型的初始化

try 从闭包访问返回的字符串时出现无法将类型 '()' 的返回表达式转换为返回类型 'String'编译器错误

如何使用Duration.TimeFormatStyle以h m s格式快速格式化时间

Swift数据关系

Xcode 15 Beta中如何使用@Observable?

避免 `(())` 显式指定 Void 类型的枚举关联值

覆盖一个子元素的 HStack 对齐方式

MacOS KIND 是如何实现的

不使用 ViewController 时如何显示推送通知的alert 对话框

不要从 NumberFormatter 获取货币符号

单元测试和私有变量

获取设备图像比例(例如@1x、@2x 和@3x)

如何在 Swift 中使用 Crashlytics 登录?

在 Swift 中指定 UITextField 的边框半径