如何在Kotlin Multiplatform Mobile(KMM)中实现电子邮件地址校验?
KMM 跨平台电子邮件地址校验实现方案
原有依赖java.util.regex.Pattern的实现仅支持JVM平台,无法适配KMM多端场景,可使用以下两种适配方案:
方案一:通用正则实现(推荐普通业务场景使用)
直接使用Kotlin跨平台标准库自带的Regex类实现,无任何平台依赖,适配所有KMM支持的目标端:
/** * 校验字符串是否为合法邮箱地址 */ fun String.isValidEmail(): Boolean { // 通用邮箱正则,覆盖99%以上日常使用场景 val emailRegex = Regex("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$") return emailRegex.matches(this.trim()) }
- 实现逻辑简单,跨平台一致性高
- 可根据业务需求自行调整正则规则
提示:不建议使用过于复杂的RFC全兼容正则,避免合法邮箱被误拦截,普通业务场景下通用正则即可满足需求
方案二:原生能力实现(推荐对校验准确性要求高的场景使用)
通过KMM的expect/actual机制调用各平台原生校验能力,准确性和兼容性更高:
commonMain 层声明公共接口
expect fun String.isValidEmail(): Boolean
androidMain 层实现
import android.util.Patterns actual fun String.isValidEmail(): Boolean { return Patterns.EMAIL_ADDRESS.matcher(this.trim()).matches() }
iosMain 层实现
import platform.Foundation.NSDataDetector import platform.Foundation.NSMakeRange import platform.Foundation.NSTextCheckingTypeLink actual fun String.isValidEmail(): Boolean { val detector = NSDataDetector.dataDetectorWithTypes(NSTextCheckingTypeLink, error = null) ?: return false val input = this.trim() val matches = detector.matchesInString( string = input, options = 0, range = NSMakeRange(0, input.length) ) return matches.size == 1 && matches.first()?.range?.length == input.length.toULong() }
- 复用各系统官方校验规则,无需自行维护正则
- 对特殊格式邮箱的兼容性更好
内容的提问来源于stack exchange,提问作者AliSh
相关产品推荐
相关产品推荐

