正则表达式或Kotlin的when语句中的通配符?

Jak*_* S. 6 regex wildcard kotlin

我正在Kotlin上开发一个RESTful应用程序,对于路由器,我正在使用when语句,因为它是最易读和美观的条件语句。

有什么方法可以在字符串的when语句中使用Regex或通配符?

(这样,URI之类的“ / article / get /”将全部传递到同一控制器)

我的路由器的结构如下:

when(uri) {
    "some/url" -> return SomeController(config).someAction(session)
}
Run Code Online (Sandbox Code Playgroud)

Tra*_*vis 6

是。

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 */
}
Run Code Online (Sandbox Code Playgroud)

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 */
}
Run Code Online (Sandbox Code Playgroud)

其中RegexWhenArgument的最低定义为:

class RegexWhenArgument (val whenArgument: CharSequence) {
    operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
    override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}
Run Code Online (Sandbox Code Playgroud)

这种方法使您尽可能接近“自变量” when表达式语法。我认为它尽可能精简易读(假设您在RegexWhenArgument其他地方定义了该类)。

这种方法结合了Kotlin的运算符重载,使用了与访客设计模式类似的东西,以重新定义在when表达式参数和a 之间构成“匹配” 的内容whenEntry。如果您确实愿意,我想您可以进一步采用这种方法RegexWhenArgument并将其通用化WhenArgumentWhenArgumentDecorator从而使您可以在when表达式中为任何类型的类型指定自定义“匹配”条件,而不仅仅是Regex。