我正在尝试解析日期格式为 MM/YY 的字符串并存储月份和年份变量。
我写了这段代码,当我传递像“1”这样的字符串时,我不明白为什么:
match.numberOfRanges
== 3match.rangeAtindex(2)
== (9223372036854775807,0)
这是我的代码(正则表达式只有两组,所以我不明白范围的数量在理论上什至可以超过 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)
最佳答案
对于输入字符串"1"
,匹配到第二个捕获组(\\d{1,2})?
零次。在这种情况下
match.rangeAtIndex(2).location
是 NSNotFound
(恰好是
Int.max = 9223372036854775807
).
对于输入字符串"/12"
,第一个捕获组(\\d{1,2})?
会
匹配零次。所以你必须检查这种情况:
var month = ""
var year = ""
if let match = match {
let monthRange = match.rangeAtIndex(1)
if monthRange.location != NSNotFound {
month = expiryDateNS.substringWithRange(monthRange)
}
let yearRange = match.rangeAtIndex(2)
if yearRange.location != NSNotFound {
year = expiryDateNS.substringWithRange(yearRange)
}
}
关于objective-c - 使用 NSRegularExpression 解析日期时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30306217/