簡體   English   中英

如何在 switch case 模式語句中使用 Swift 文字正則表達式?

[英]How to use Swift literal regex expressions in switch case pattern statements?

如何在 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語句以某種方式修改為 function OK? 如何在 switch case 模式語句中使用新的 Swift 5.7 正則表達式功能?

據我所知,“與switch語句中的正則表達式匹配”功能尚未實現,因為人們在爭論確切的語義應該是什么。 萬一

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

switch 語句應該運行哪個分支? 只有當整個字符串與正則表達式匹配時,它才算作匹配嗎?還是僅讓切換字符串的 substring 匹配就足夠了? 換句話說,它是wholeMatch還是firstMatch 此處查看更多討論。

最終,他們無法得出結論,而

該提案已被接受並進行了修改(修改是暫時將~=子集化)。

所以~=運算符沒有為Regex<Output>添加,所以你不能在開關中使用它。

如果你願意,你可以自己添加它,如果你可以在兩種語義之間做出決定:)例如:

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

可以將帶有 Swift 正則表達式文字表達式的 switch case 語句以某種方式修改為 function OK?

是的,使用從 Swift 5.7 開始發布的正則表達式功能的case let … where …方法。

經典示例- 一個“經典”正則表達式示例方法,其中/^…$/可用於匹配整行:

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")
}

Whole-Match-Only Example - 一個“whole-match only”正則表達式方法,其中部分匹配是不可能的:

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+/")
}

由於以下原因,我最終使用了Classic Example方法而不是Whole-Match-Only Examplefunc ~=方法:

  • func ~= - 可能在未來某個時間由 Swift 定義。 未來可能的混亂。
  • Whole-Match-Only Example - 不支持部分匹配和完全匹配。 表達能力差。
  • 經典例子
    • 留下~= undefined 這允許 Swift 可能的未來定義。避免未來可能的混淆。
    • 確實支持部分匹配和完全匹配。 更具表現力。
    • ^…$明確聲明為全行匹配。 更具可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM