如何在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
语句是否可以修改为函数OK?如何在switch case模式语句中使用Swift 5.7正则表达式的新功能?
2条答案
按热度按时间ippsafx71#
根据我的发现,“匹配
switch
语句中的正则表达式”特性还没有实现,因为人们在争论确切的语义应该是什么。switch语句应该运行哪个分支?它应该只在整个字符串匹配正则表达式时才算匹配,还是只匹配切换字符串的一个子字符串就足够了?换句话说,它是
wholeMatch
还是firstMatch
?请参阅here的更多讨论。最后,他们无法得出结论,
该建议已被接受,但有一些修改(修改是暂时将
~=
子集化)。因此,没有为
Regex<Output>
添加~=
运算符,所以不能在交换机中使用它。如果你愿意,你可以自己添加它,如果你能在两种语义之间做出选择:)例如:
iqjalb3h2#
带Swift正则表达式的switch case语句可以修改为正常运行吗?
是的,使用
case let … where …
方法和Swift 5.7开始发布的regex功能。经典示例-
/^…$/
可用于匹配整行的“经典”正则表达式示例方法:仅全匹配示例-“仅全匹配”正则表达式方法,其中部分匹配是不可能的:
我最终使用了经典示例方法,而不是仅全匹配示例和**
func ~=
**方法,原因如下:*
func ~=
-可能由Swift在未来某个时间定义。未来可能发生冲突。*Whole-Match-Only示例-不同时支持部分匹配和完全匹配。不太有表现力。
*经典示例
^…$
是明确规定的一个完整的行匹配。更具可读性。