我正在使用Kotlin中的RESTful应用程序和路由器,我正在使用when语句,因为它是最具可读性和良好的条件。
有没有办法在字符串的when语句中使用正则表达式或通配符?
(所以像“/ article / get /”这样的URI都将传递给同一个控制器)
我的路由器结构如下:
{{1}}
答案 0 :(得分:5)
是
import kotlin.text.regex
val regex1 = Regex( /* pattern */ )
val regex2 = Regex( /* pattern */ )
/* etc */
when {
regex1.matches(uri) -> /* do stuff */
regex2.matches(uri) -> /* do stuff */
/* etc */
}
如果符合您的需求,您也可以containsMatchIn
使用matches
。
<强>解释强>
when
语句的测试表达式是可选的。如果未包含测试表达式,则when
语句的作用类似于if-else if
链,其中每个whenCondition
的whenEntry
应独立评估为布尔值。
编辑:
所以我想了一会儿,我提出了一种可能更接近你想要的不同方法。
import kotlin.text.regex
when (RegexWhenArgument(uri)) {
Regex(/* pattern */) -> /* do stuff */
Regex(/* pattern */) -> /* do stuff */
/* etc */
}
RegexWhenArgument
最低限度定义为:
class RegexWhenArgument (val whenArgument: CharSequence) {
operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}
这种方法可以让您尽可能接近“argument-ful”when
表达式语法。我认为它可以是简化和可读的(假设您在其他地方定义RegexWhenArgument
类)。
这种方法使用类似于访问者设计模式的东西,结合Kotlin的运算符重载来重新定义构成when
表达式参数和whenEntry
之间“匹配”的内容。如果您真的想要,我想您可以更进一步,并将RegexWhenArgument
简化为通用WhenArgument
和WhenArgumentDecorator
,允许您指定自定义“匹配”条件任何类型的when
表达式,而不仅仅是Regex。