Swift中检测字符串连续3位重复或递增数字的正则需求
解决字符串验证的连续重复/递增数字检测问题
嘿,我来帮你搞定这个验证逻辑的补充!首先得先修正一下你原来的lengthAndElementRegEx——因为\w会包含下划线_,但你要求只允许大小写字母、数字和连字符,所以这个正则得调整一下。
接下来针对你需要的两个检测规则,我给你整理了简洁的正则表达式,同时把完整的验证函数修正好:
修正后的验证逻辑说明
- 基础规则验证:字符串长度5-23位,仅允许大小写字母、数字、连字符
- 违规检测:禁止出现连续3位重复数字(如
111)或连续3位递增数字(如123)
对应的正则表达式
基础验证正则
^[a-zA-Z0-9-]{5,23}$
[a-zA-Z0-9-]:明确指定允许的字符集,排除了下划线{5,23}:限制长度在5到23位之间^和$:确保整个字符串都符合规则,避免部分匹配
违规检测正则
.*((\\d)\\1{2}|(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2}).*
(\\d)\\1{2}:匹配连续3位重复的数字——捕获一个数字,然后匹配两个和它相同的数字(?:0(?=1)|1(?=2)|...|8(?=9)){2}:匹配连续3位递增的数字——用正向预查检查每个数字后面跟着下一个递增的数字,连续两次这样的匹配就代表三个递增数字(比如123会匹配1(?=2)和2(?=3)).*:允许这些违规模式出现在字符串的任意位置
完整的验证函数
func iDValidator(_ id: String) -> Bool { // 修正后的基础规则正则 let lengthAndElementRegEx = "^[a-zA-Z0-9-]{5,23}$" // 检测连续重复/递增数字的正则 let continuousRegEx = ".*((\\d)\\1{2}|(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2}).*" let lengthAndElementValidate = NSPredicate(format:"SELF MATCHES %@", lengthAndElementRegEx) guard lengthAndElementValidate.evaluate(with: id) else { return false } let continuousValidate = NSPredicate(format:"SELF MATCHES %@", continuousRegEx) // 如果匹配到违规模式,返回false guard !continuousValidate.evaluate(with: id) else { print("包含连续重复或递增的三位数字") return false } return true }
这里调整了原来的guard语句逻辑——因为我们需要如果存在违规模式就验证失败,所以当continuousValidate.evaluate(with: id)为true时(也就是匹配到了违规内容),我们返回false,所以用!取反。
内容的提问来源于stack exchange,提问作者김민식
相关产品推荐
相关产品推荐

