使用 Swift 从字符串中检测数字年份

Detect numeric year from string using Swift

我正在寻找一种检测年份的方法,例如2019. 我认为要求是数字连续,有四位数字并且不与字母或特殊字符相邻。所以我想在以下每种情况下获得 return "2019" 的方法:

"2019"
"in 2019
"Before 2019, all IOS apps were written in one of 2 ways"

但将其排除在:

"1234z20191234

有很多方法可以检测字符串中的数字,如seen here,例如

let newString = origString
    .components(separatedBy:CharacterSet.decimalDigits.inverted)
    .joined(separator: "")

但他们不会拉出每个系列的数字来测试长度和相邻性。

数据检测器可以尝试提取一个日期,但是从可能的日期到可能已经在起始文本中的年份似乎容易出错,例如使用类似的东西:

“2018-08-31 04:00:00 +0000”, “America/Los_Angeles”, 18000.0

任何人都可以建议一种从字符串中检索数字年份的可靠方法吗?

您可以使用正则表达式,在单词边界 (\b) 之间搜索四位数字 ([0-9]{4}),例如

let strings = [
    "2019",
    "in 2019",
    "Before 2019, all IOS apps were written in one of 2 ways",
    "1234z20191234"
]

for string in strings {
    if let range = string.range(of: #"\b[0-9]{4}\b"#, options: .regularExpression) {
        let year = String(string[range])
        print(year)
    } else {
        print("No year found")
    }
}

制作中:

2019
2019
2019
No year found

注意,上面使用了Swift5的扩展字符串定界符,#""#。如果在较早的 Swift 版本中执行此操作,您将只想用另一个反斜杠转义反斜杠:

if let range = string.range(of: "\b[0-9]{4}\b", options: .regularExpression) {
    ...
}

很明显,如果你想缩小识别为年份的四位数字的范围,你必须调整正则表达式或用一些逻辑补充它。但是你的问题没有确定你想用什么标准来检测年份。

您可以使用正则表达式来做到这一点。此代码将查找给定字符串中的所有年份。您可以设置检查以确认号码在您希望接受的任何范围内。

func findYears(in text: String) -> [String] {
    let yearRE = try! NSRegularExpression(pattern: "(?:\b)[0-9]{4}(?:\b)")
    var results = [String]()
    yearRE.enumerateMatches(in: text, range: NSRange(text.startIndex..<text.endIndex, in: text)) { (result, flags, stop) in
        if let result = result {
            let match = String(text[Range(result.range(at: 0), in: text)!])
            // Set whatever range you wish to accept
            if let year = Int(match), year > 1600 && year < 2200 {
                results.append(match)
            }
        }
    }

    return results
}

let yearStrings = [
    "2019",
    "in 2019 and 2020",
    "Before 2019, all IOS apps were written in one of 2 ways",
    "1234z20191234",
    "2018-08-31 04:00:00 +0000",
]
for yearString in yearStrings {
    print(findYears(in: yearString))
}

输出:

["2019"]
["2019", "2020"]
["2019"]
[]
["2018"]