objective-c - 使用 NSRegularExpression 解析日期时出现问题

标签 objective-c regex swift cocoa nsregularexpression

我正在尝试解析日期格式为 MM/YY 的字符串并存储月份和年份变量。

我写了这段代码,当我传递像“1”这样的字符串时,我不明白为什么:

  • match.numberOfRanges == 3
  • match.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).locationNSNotFound(恰好是 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/

相关文章:

swift - 如果在 Swift 中为 nil,则赋值的简写?

ios - Swift 中的本地参数名和外部参数名有什么区别

ios - 将对象传递给选择器时遇到问题

ios - 带有来自 plist 的数据的 objective-c 过滤 TableView

javascript - 如何用 REGEX 替换整个文本中的某些符号,引号文本除外

javascript - 如何去除混淆的电子邮件 header

ios - 如何在 objective-c 模型类中存储处理程序?

ios - 如何制作一系列句子?

ruby - 将对齐方式放入 <td> 标记的正则表达式

swift - 在 Swift 中以编程方式将图像添加/删除到 subview