正则表达式或通配符在Kotlin的声明?

我正在为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

说明:

when语句的测试表达式是可选的。 如果不包含测试表达式,那么when语句的功能就像一个if-else if链,其中每个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”。 我认为它可以是简化和可读的(假设你在其他地方定义了RegexWhenArgument类)。

这种方法使用与访问者设计模式类似的东西,结合Kotlin的操作符重载来重新定义何时构成when表达式参数和whenEntry之间的“匹配”。 如果你真的想,我想你可以采取这种方法更进一步,并将RegexWhenArgument生成通用的WhenArgumentWhenArgumentDecorator ,它允许您在任何类型的表达式中指定自定义的“匹配”条件,而不仅仅是正则表达式。