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

use*_*314 1 nsdate isnumeric ios swift

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

\n\n
"2019"\n"in 2019\n"Before 2019, all IOS apps were written in one of 2 ways"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但将其排除在外:

\n\n
"1234z20191234\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
let newString = origString\n    .components(separatedBy:CharacterSet.decimalDigits.inverted)\n    .joined(separator: "")\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
\xe2\x80\x9c2018-08-31 04:00:00 +0000\xe2\x80\x9d, \xe2\x80\x9cAmerica/Los_Angeles\xe2\x80\x9d, 18000.0\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Rob*_*Rob 5

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

\n\n
let strings = [\n    "2019",\n    "in 2019",\n    "Before 2019, all IOS apps were written in one of 2 ways",\n    "1234z20191234"\n]\n\nfor string in strings {\n    if let range = string.range(of: #"\\b[0-9]{4}\\b"#, options: .regularExpression) {\n        let year = String(string[range])\n        print(year)\n    } else {\n        print("No year found")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

生产:

\n\n
\n

2019
\n 2019
\n 2019
\n 未找到年份

\n
\n\n

请注意,上面使用了 Swift 5\xe2\x80\x99s 扩展字符串分隔符,#"并且"#. 如果在早期的 Swift 版本中执行此操作,您\xe2\x80\x99 将只想用另一个反斜杠转义反斜杠:

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

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

\n