表达式中正则表达式匹配的习语

使用不可变的本地人:

使用较少的水平空间但比匿名临时模板更多的垂直空间。如果 when 表达式在循环中,则优先于匿名临时模板模板 - 在这种情况下,正则表达式定义应放在循环之外。

import kotlin.text.regex

var string = /* some string */

val regex1 = Regex( /* pattern */ )
val regex2 = Regex( /* pattern */ )
/* etc */

when {
    regex1.matches(string) -> /* do stuff */
    regex2.matches(string) -> /* do stuff */
    /* etc */
}

使用匿名临时工:

使用较少的垂直空间但比不可变的本地模板更多的水平空间。如果 when 表达式处于循环中,则不应该使用。

import kotlin.text.regex

var string = /* some string */

when {  
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    /* etc */
}

使用访客模式:

有利于密切模仿“argument-ful”when 语法。这是有益的,因为它更清楚地表明了 when 表达式的论证,并且还排除了由于必须在每个 whenEntry 中重复 when 参数而可能产生的某些程序员错误。immutable localsanonymous temporaries 模板可以与此实现一起使用访问者模式。

import kotlin.text.regex

var string = /* some string */

when (RegexWhenArgument(string)) {
    Regex( /* pattern */ ) -> /* do stuff */
    Regex( /* pattern */ ) -> /* do stuff */
    /* etc */
}

并且 when 表达式参数的包装类的最小定义:

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