¿Regex o comodín en la statement de Kotlin cuando?

Estoy trabajando en una aplicación RESTful en Kotlin y para el enrutador, estoy usando una statement when, ya que es el condicional más legible y atractivo.

¿Hay alguna forma de usar Regex o un comodín en la instrucción when de una cadena?

(Para que los URI como "/ article / get /" pasen todos al mismo controller)

La estructura de mi enrutador es la siguiente:

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

Sí.

 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 */ } 

También puede usar containsMatchIn si satisface sus necesidades mejor que las matches .

Explicación:

La expresión de testing de una instrucción when es opcional. Si no se incluye una expresión de testing, entonces la instrucción when funciona como if-else if chain, donde whenCondition de cada whenEntry evaluará de forma independiente a boolean.


EDITAR:

Así que pensé en ello por un time, y se me ocurrió un enfoque diferente que podría estar más cerca de lo que quieres.

 import kotlin.text.regex when (RegexWhenArgument(uri)) { Regex(/* pattern */) -> /* do stuff */ Regex(/* pattern */) -> /* do stuff */ /* etc */ } 

Donde RegexWhenArgument se define mínimamente como:

 class RegexWhenArgument (val whenArgument: CharSequence) { operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument) override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry) } 

Este enfoque le permite acercarse lo más posible al "argumentful" when syntax de la expresión. Creo que es lo más sencillo y legible posible (suponiendo que defina la class RegexWhenArgument otro lugar).

Este enfoque utiliza algo similar al patrón de layout del visitante en combinación con la sobrecarga del operador de Kotlin para networkingefinir qué constituye una "coincidencia" entre un argumento de expresión when y whenEntry . Si realmente quisiera, supongo que podría llevar este enfoque un paso más allá y generar RegexWhenArgument en un WhenArgument y WhenArgumentDecorator propósito WhenArgumentDecorator que le permita especificar criterios de "coincidencia" personalizados en una expresión when para cualquier tipo de tipo, no solo Regex .

  • Una expresión regular que reconocería a / * ... * / note
  • Juego Regex en Kotlin
  • Regex: un metacarácter para reconocer cualquier tipo de personaje
  • Diseño de expresiones regulares multilínea