表示式中正規表示式匹配的習語

使用不可變的本地人:

使用較少的水平空間但比匿名臨時模板更多的垂直空間。如果 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)
}