如何实现密码中用户名及≥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
相关产品推荐
相关产品推荐

