Учитывая эту строку:
let str = "Fully <em>Furni<\\/em>shed |Downtown and Canal Views"
и соответствующий NSRange
:
let range = NSRange(location: 0, length: (str as NSString).length)
Давайте создадим регулярное выражение, которое будет соответствовать буквам от <em>
до </em>
или перед </em>
let regex = try NSRegularExpression(pattern: "(?<=<em>)\\w+(?=<\\\\/em>)|(?<=<\\\\/em>)\\w+")
Что он делает:
- искать 1 или более букв:
\\w+
,
- , которым предшествуют
<em>
: (?<=<em>)
(положительный lookbehind ),
- и затем
<\/em>
: (?=<\\\\/em>)
(положительный прогноз ),
- или:
|
- буквы:
\\w+
,
- , которому предшествует
<\/em>
: (?=<\\\\/em>)
(положительный lookbehind )
Получим совпадения:
let matches = regex.matches(in: str, range: range)
которые мы можем превратить в подстроки:
let strings: [String] = matches.map { match in
let start = str.index(str.startIndex, offsetBy: match.range.location)
let end = str.index(start, offsetBy: match.range.length)
return String(str[start..<end])
}
Теперь мы можем объединять строки в четные индексы, с нечетными:
let evenStride = stride(from: strings.startIndex,
to: strings.index(strings.endIndex, offsetBy: -1),
by: 2)
let result = evenStride.map { strings[$0] + strings[strings.index($0, offsetBy: 1)]}
print(result) //["Furnished"]
Мы можем проверить это с другой строкой:
let str2 = "<em>Furni<\\/em>shed <em>balc<\\/em>ony <em>gard<\\/em>en"
результат будет:
["Furnished", "balcony", "garden"]