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
泛化为通用的 WhenArgument
和 WhenArgumentDecorator
,允许您指定自定义 "match"任何类型的 when
表达式中的条件,而不仅仅是正则表达式。
我正在使用 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
泛化为通用的 WhenArgument
和 WhenArgumentDecorator
,允许您指定自定义 "match"任何类型的 when
表达式中的条件,而不仅仅是正则表达式。