首页 > 解决方案 > 使用 Swift 从字符串中检测数字年份

问题描述

我正在寻找一种检测年份的方法,例如 2019 年。我认为要求是数字连续,有四位数字,并且不与字母或特殊字符相邻。因此,我希望在以下每种情况下都返回“2019”的方法:

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

但将其排除在:

"1234z20191234

有很多方法可以检测字符串中的数字,如此处所示,例如

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

但他们不会提取每个系列的数字来测试长度和邻接性。

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

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

谁能建议一种从字符串中检索数字年份的可靠方法?

标签: iosswiftnsdateisnumeric

解决方案


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

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 未
找到年份

注意,上面使用了 Swift 5 的扩展字符串分隔符,#""#. 如果在早期的 Swift 版本中这样做,你会想用另一个反斜杠来转义反斜杠:

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

显然,如果您想缩小识别为年份的四位数字的范围,则必须调整正则表达式或用一些逻辑对其进行补充。但是您的问题并未确定您要使用什么标准来检测年份。


推荐阅读