在Kotlin的声明中使用正则表达式还是通配符?

时间:2016-12-21 19:43:17

标签: regex wildcard kotlin

我正在使用Kotlin中的RESTful应用程序和路由器,我正在使用when语句,因为它是最具可读性和良好的条件。

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

(所以像“/ article / get /”这样的URI都将传递给同一个控制器)

我的路由器结构如下:

{{1}}

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链,其中每个whenConditionwhenEntry应独立评估为布尔值。

编辑:

所以我想了一会儿,我提出了一种可能更接近你想要的不同方法。

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简化为通用WhenArgumentWhenArgumentDecorator,允许您指定自定义“匹配”条件任何类型的when表达式,而不仅仅是Regex。