表达式中正则表达式匹配的习语
使用不可变的本地人:
使用较少的水平空间但比匿名临时模板更多的垂直空间。如果 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 locals
或 anonymous 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)
}