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

qv7cva1a  于 2023-01-12  发布在  Swift
关注(0)|答案(2)|浏览(157)

如何在switch case模式语句中使用Swift常量正则表达式?
根据WWDC 2022演示幻灯片中的示例,预计以下内容将编译并正常运行:

import Foundation
import RegexBuilder

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

但是,会产生以下错误:
Regex<Substring>类型的表达式模式不能与String类型的值匹配
带Swift正则表达式的switchcase语句是否可以修改为函数OK?如何在switch case模式语句中使用Swift 5.7正则表达式的新功能?

ippsafx7

ippsafx71#

根据我的发现,“匹配switch语句中的正则表达式”特性还没有实现,因为人们在争论确切的语义应该是什么。

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

switch语句应该运行哪个分支?它应该只在整个字符串匹配正则表达式时才算匹配,还是只匹配切换字符串的一个子字符串就足够了?换句话说,它是wholeMatch还是firstMatch?请参阅here的更多讨论。
最后,他们无法得出结论,
该建议已被接受,但有一些修改(修改是暂时将~=子集化)。
因此,没有为Regex<Output>添加~=运算符,所以不能在交换机中使用它。
如果你愿意,你可以自己添加它,如果你能在两种语义之间做出选择:)例如:

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

iqjalb3h2#

带Swift正则表达式的switch case语句可以修改为正常运行吗?
是的,使用case let … where …方法和Swift 5.7开始发布的regex功能。

经典示例-/^…$/可用于匹配整行的“经典”正则表达式示例方法:

extension String {
    func classic(_ regex: Regex<Substring>) -> Bool {
        // errors count as "not match"
        (try? regex.firstMatch(in: self)) != nil
    }    
}

switch "---abc---" {
    case let s where s.classic(/^\w+$/):
        print("entire line contains alphanumerics: '\(s)'")
    case let s where s.classic(/\w+/):
        print("alphanumerics found in string: '\(s)'")
    default:
        print("no alphanumerics found")
}

仅全匹配示例-“仅全匹配”正则表达式方法,其中部分匹配是不可能的:

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

switch "---abc---" {
    case let s where s.whole(/\w+/):
        print("all alphanumerics: '\(s)'")
    default:
        print("no match for /\\w+/")
}

我最终使用了经典示例方法,而不是仅全匹配示例和**func ~=**方法,原因如下:

*func ~=-可能由Swift在未来某个时间定义。未来可能发生冲突。
*Whole-Match-Only示例-不同时支持部分匹配和完全匹配。不太有表现力。
*经典示例

  • 支持部分匹配和完全匹配。更具表现力。
  • ^…$是明确规定的一个完整的行匹配。更具可读性。

相关问题