[英]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 Example和func ~=
方法:
func ~=
- 可能在未來某個時間由 Swift 定義。 未來可能的混亂。~=
undefined 這允許 Swift 可能的未來定義。避免未來可能的混淆。^…$
明確聲明為全行匹配。 更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.