Kotlin中如何高效校验LDDLLDDDDDDL格式的序列号字符串?
优化Kotlin序列号格式校验的几种方案
你的嵌套if实现不仅可读性差,还存在未校验字符串长度导致数组越界的风险,以下几种方案可以大幅优化代码的简洁性和健壮性:
方案一:正则表达式(最简洁高效)
利用正则表达式直接匹配固定格式LDDLLDDDDDDL,代码量最少且逻辑清晰:
fun checkFormat(numSerie: String): Boolean { // 正则规则:开头字母 → 2个数字 → 2个字母 → 6个数字 → 结尾字母 val serialPattern = "^[A-Za-z]\\d{2}[A-Za-z]{2}\\d{6}[A-Za-z]$".toRegex() return serialPattern.matches(numSerie) }
- 解释:
^和$确保整个字符串完全匹配格式,[A-Za-z]匹配大小写字母,\d{n}匹配n个数字,完全对应你的序列号格式要求。
方案二:模式遍历(灵活易扩展)
如果后续需要调整格式规则,或者需要更精细的错误定位,可以定义校验模式数组,遍历每个字符进行校验:
fun checkFormat(numSerie: String): Boolean { // 先校验长度,避免数组越界 if (numSerie.length != 12) return false // 定义每个位置的校验规则:true=字母,false=数字 val formatRules = listOf( true, false, false, // LDD true, true, // LL false, false, false, false, false, false, // DDDDDD true // L ) // 遍历每个字符,验证是否符合对应位置的规则 return numSerie.withIndex().all { (index, char) -> if (formatRules[index]) char.isLetter() else char.isDigit() } }
- 优势:格式规则可视化,后续修改格式只需调整
formatRules数组即可,扩展性强。
方案三:链式调用(快速重构原逻辑)
如果你想保留原有的逐个字符校验逻辑,用&&替代嵌套if,让代码结构更扁平:
fun checkFormat(numSerie: String): Boolean { if (numSerie.length != 12) return false val chars = numSerie.toCharArray() return chars[0].isLetter() && chars[1].isDigit() && chars[2].isDigit() && chars[3].isLetter() && chars[4].isLetter() && chars[5].isDigit() && chars[6].isDigit() && chars[7].isDigit() && chars[8].isDigit() && chars[9].isDigit() && chars[10].isDigit() && chars[11].isLetter() }
- 改进点:提前校验长度避免越界,用链式逻辑替代嵌套if,可读性大幅提升。
内容的提问来源于stack exchange,提问作者Ekaitz Busto Ruiz de Gordoa
相关产品推荐
相关产品推荐

