You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现密码中用户名及≥3字符片段的校验(代码优化需求)

解决方案

要同时满足两条密码校验规则,我们需要生成用户姓名所有长度≥3的连续子串,结合完整姓名部分一起做匹配校验。优化后的代码如下:

data class PasswordData(val username: String, val password: String)

fun containsUsername(data: PasswordData): Boolean {
    // 1. 按空格拆分姓名为独立部分
    val nameParts = data.username.split(" ")
    
    // 2. 收集所有禁止出现的片段:完整姓名部分 + 所有长度≥3的子串
    val forbiddenFragments = mutableSetOf<String>()
    nameParts.forEach { part ->
        // 添加完整的姓名分段
        forbiddenFragments.add(part)
        // 生成该分段下所有长度≥3的连续子串
        for (start in 0..part.length - 3) {
            for (end in start + 3..part.length) {
                forbiddenFragments.add(part.substring(start, end))
            }
        }
    }
    
    // 3. 构建不区分大小写的正则表达式,转义特殊字符避免语法冲突
    val patternString = forbiddenFragments.joinToString("|") { Regex.escape(it) }
    val namePattern = Regex("(?i).*($patternString).*")
    
    return namePattern.containsMatchIn(data.password)
}

fun main() {
     val username = "Maria Antonia dos Santos"
     val password1 = "AbcMariaXyz" // 包含完整"Maria"
     val password2 = "AntoniaMaria" // 包含完整"Maria"
     val password3 = "Maria123" // 包含完整"Maria"
     val password4 = "AntoniaSenha" // 包含完整"Antonia"
     val password5 = "Dos_123" // 包含完整"dos"(不区分大小写)
     val password6 = "SantosAbc" // 包含完整"Santos"
     val password7 = "OniSenha" // 包含"Antonia"的子串"Oni"
     val password8 = "MarSenha" // 包含"Maria"的子串"Mar"
    
     println(containsUsername(PasswordData(username, password1))) // true
     println(containsUsername(PasswordData(username, password2))) // true
     println(containsUsername(PasswordData(username, password3))) // true
     println(containsUsername(PasswordData(username, password4))) // true
     println(containsUsername(PasswordData(username, password5))) // true
     println(containsUsername(PasswordData(username, password6))) // true
     println(containsUsername(PasswordData(username, password7))) // true
     println(containsUsername(PasswordData(username, password8))) // true
}

关键优化说明

  • 覆盖规则2:对每个姓名分段(如Antonia),遍历生成所有长度≥3的连续子串(如Ant、oni、Anto等),确保任何长度达标姓名片段都被检测到。
  • 去重处理:用mutableSetOf存储禁止片段,自动剔除重复子串,避免正则表达式冗余。
  • 特殊字符兼容:通过Regex.escape(it)处理姓名中的特殊字符,防止正则语法冲突。
  • 大小写无关:保留(?i)标志,确保匹配时忽略大小写差异(如密码Dos可匹配姓名dos)。

内容的提问来源于stack exchange,提问作者Júlio Marvim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:48:37