Определить числовой год из строки, используя Swift - PullRequest
0 голосов
/ 25 мая 2019

Я ищу способ определения года, например 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

Кто-нибудь может предложить надежный способ получить числовой год из строки?

Ответы [ 2 ]

3 голосов
/ 25 мая 2019

Вы можете использовать регулярное выражение для поиска четырех цифр ([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) {
    ...
}

Очевидно, что если вы хотите сузить диапазон из четырехзначных чисел, распознаваемых как годы, вам придется настроить регулярное выражение или дополнить его некоторой логикой. Но ваш вопрос не определяет, какие критерии вы хотите использовать для определения лет.

0 голосов
/ 25 мая 2019

Вы можете сделать это с помощью регулярного выражения. Этот код найдет все годы в данной строке. Вы можете установить чек, чтобы подтвердить, что число находится в пределах любого диапазона, который вы хотите принять.

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"]

...