我希望捕获长度在6到8位之间的密码。
我想匹配: 123-4567 和 12-34-56-78
失败: 1234567890 和 123-456-7890
目前我正在使用(\\b(?:\\d[-,\\h]?+){5,7}\\d\\b)
这成功击退了 1234567890 ,但在 123-456-7890 上给出了部分匹配。字边界是否有办法在其中包含连字符?
答案 0 :(得分:1)
您可以使用外观:
(?<!-)\b\d(?:[-,\h]?\d){5,7}(?!-)\b
请参阅regex demo
Swift正则表达式使用ICU风格,因此lookbehind和lookahead都可以使用。 (?<!-)
lookbehind确保在开始新单词的数字之前(或单词边界之后)没有-
,并且(?!-)
预测确保没有-
在第8个数字后右边的单词边界。
不要忘记使用双反斜杠。
正如@AlanMoore建议的那样,单词边界和-
- 外观可以用外观(?<![\w-])
和(?![\w-])
代替。这将使正则表达式更有效率,因为在开始和结束时只有一个位置需要检查一次:
(?<![\w-])\d(?:[-,\h]?\d){5,7}(?![\w-])
请参阅another demo
答案 1 :(得分:1)
不是确切的字面答案,而是替代的原生Swift解决方案
enum CheckResult {
case Success(String), Failure
}
func checkPassCode(string : String) -> CheckResult
{
let filteredArray = string.characters.filter{ $0 != "-" }.map{ String($0) }
return (6...8).contains(filteredArray.count) ? .Success(filteredArray.joinWithSeparator("")) : .Failure
}
checkPassCode("123-4567") // Success(1234567)
checkPassCode("12-34-56-78") // Success(12345678)
checkPassCode("1234567890") // Failure
checkPassCode("123-456-7890") // Failure