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

Regex or Wildcard in Kotlin's when statement?

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

有没有办法在字符串的 when 语句中使用正则表达式或通配符?

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

我的路由器结构如下:

when(uri) {
    "some/url" -> return SomeController(config).someAction(session)
}

是的。

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 if that suits your needs better than matches.

解释:

when statement is optional. If no test expression is included, then the when statement functions like an if-else if chain, where the whenCondition of each 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 class)。

这种方法使用类似于访问者设计模式的东西,结合 Kotlin 的运算符重载来重新定义什么构成了 when 表达式参数和 whenEntry 之间的 "match"。如果您真的想要,我想您可以进一步采用这种方法,将 RegexWhenArgument 泛化为通用的 WhenArgumentWhenArgumentDecorator,允许您指定自定义 "match"任何类型的 when 表达式中的条件,而不仅仅是正则表达式。