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)
是。
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并将其通用化WhenArgument,WhenArgumentDecorator从而使您可以在when表达式中为任何类型的类型指定自定义“匹配”条件,而不仅仅是Regex。
| 归档时间: |
|
| 查看次数: |
1422 次 |
| 最近记录: |