Я пытаюсь проанализировать строку с форматом даты, например MM/YY, и сохранить переменные месяца и года.
Я написал этот код и не могу понять, почему, когда я передаю строку типа «1»:
match.numberOfRanges
== 3match.rangeAtindex(2)
== (9223372036854775807,0)
Вот мой код (regex имеет только две группы, поэтому я не понимаю, как количество диапазонов может быть даже теоретически больше 2).
let regex = NSRegularExpression(pattern: "^(\\d{1,2})?[\\s/]*(\\d{1,2})?", options: NSRegularExpressionOptions.allZeros, error: nil)
// Expiry date string is "1"
let match = regex?.firstMatchInString(expiryDate, options: NSMatchingOptions.allZeros, range: NSMakeRange(0, expiryDateNS.length))
if let match = match {
let monthRange = match.rangeAtIndex(1)
// next string works correct - month contains "1"
var month = expiryDateNS.substringWithRange(monthRange)
if match.numberOfRanges > 1 { // match.numberOfRanges returns 3
let yearRange = match.rangeAtIndex(2) // returns LONG_MAX as location, 0 as length
// next line will crash
expiryYear = expiryDateNS.substringWithRange(yearRange)
}
}
ОБНОВЛЕНИЕ По просьбе @matt я добавляю сюда несколько примеров.
- Строка "1" должна быть проанализирована и сохранена как
month == "1"
иexpiryYear == ""
. - Строка "12" должна быть проанализирована и сохранена как
month == "12"
иexpiryYear == ""
. - Строка "12/45" должна быть проанализирована и сохранена как
month == "12"
иexpiryYear == "45"
.
Когда я анализирую строку «1» с кодом выше, match.numberOfRanges
равно 3, а match.rangeAtindex(2)
равно (9223372036854775807,0)
pattern
совершенно неверен. Если бы это было правильно, вы бы вообще не совпадали с 1. - person matt   schedule 18.05.2015