如何修改包含' - '作为单词字符

时间:2015-12-07 15:26:43

标签: ios regex swift

我希望捕获长度在6到8位之间的密码。

我想匹配: 123-4567 12-34-56-78

失败: 1234567890 123-456-7890

目前我正在使用(\\b(?:\\d[-,\\h]?+){5,7}\\d\\b) 这成功击退了 1234567890 ,但在 123-456-7890 上给出了部分匹配。字边界是否有办法在其中包含连字符?

2 个答案:

答案 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