Kotlin 正規表現はStringの拡張関数でカプセル化しておく

はじめに

今回は、正規表現に関するおすすめ対処法です。
正規表現で文字列を判定する場合に、Utility・Helperなどのクラスを作成するのはよくみられます。

間違いではないので、別に悪いことではないのですが、Utility・Helperなどのクラスは役割がどの範囲なのかということがあやふやになってしまいがちなので、個人的にはExtensionで作成することが多いです。

これだと、Stringに対する判定なのか、Intに対する判定値なのかということが明確になりますし、Stringオブジェクトからそのまま実行することができます。
また、正規表現が1つにまとめられるので電話番号はハイフンなくすといった変更にも対応しやすいです。

ただ、この辺りは論争になりそうな雰囲気もありますが、、

/**
 * メールアドレスの有効判定
 *
 * @return Boolean
 */
fun String.isEmail(): Boolean {
    return Patterns.EMAIL_ADDRESS.matcher(this).matches()
}

/**
 * 電話番号の有効判定
 *
 * @return Boolean
 */
fun String.isPhoneNumber(): Boolean {
    val regex = Regex("[0-9]{10,11}|[0-9]{2,4}[- ][0-9]{1,4}[- ][0-9]{4}")
    return regex.matches(this)
}

/**
 * 郵便番号の有効判定
 *
 * @return Boolean
 */
fun String.isZipcode(): Boolean {
    val regex = Regex("[0-9]{3}-?[0-9]{4}")
    return regex.matches(this)
}

おまけ

パスワードの入力チェックなどもこのようにしておくことがあります。
正直、認証基盤の仕様によるのでExtensionにするのは如何なものかという意見もありますが、入力判定ロジックは可能な限りまとめておきたいのでこのようにすることもあります。

/**
 * パスワードの有効判定
 *
 * @return Boolean
 */
fun String.isPassword(): Boolean {
    return length in PASSWORD_MIN_LENGTH..PASSWORD_MAX_LENGTH
}