Скажи, если у меня есть предложение:
a fox jumps over another fox
Мне нужно сопоставить его со списком слов с их соответствующим диапазоном внутри строки, например, первая «лиса» должна сопоставляться с:
["fox", NSRange(2, 3)]
трудность здесь заключается в дублировании слов, таких как два «лиса», я могу проверить индекс каждого слова в строке и удалить слово (из строки) по мере продвижения, но есть ли более умный способ сделать это?
Еще одна задача — когда в слове есть точка, скажем:
a fox jumps over another f.x
если я ищу диапазон для «f.x», вероятно, он также будет соответствовать «лисе»?
Спасибо!
Спасибо @Sweeper. Я хочу, чтобы каждое слово в предложении и их диапазон в предложении, например, два «лиса» в «лиса прыгает через другую лису» должны дать мне («лиса», диапазон1) и («лиса», диапазон2) где range1 и range2 разные.
Вы можете использовать метод String enumerateSubstrings(in:, options:)
и использовать параметры byWords:
func enumerateSubstrings<R>(in range: R, options opts: EnumerationOptions = [], _ body: @escaping (String?, Range<Index>, Range<Index>, inout Bool) -> Void) where R : RangeExpression, R.Bound == Index
extension String {
var byWordsAndRanges: [(String, Range<Index>)] {
var wordsAndRanges: [(String, Range<Index>)] = []
enumerateSubstrings(in: startIndex..., options: .byWords) { word, range, _, _ in
// The force unwrap of word is safe. It will only be nil if `substringNotRequired` is included in opts
wordsAndRanges.append((word!, range))
}
return wordsAndRanges
}
}
let test = "a fox jumps over another fox"
for (word, range) in test.byWordsAndRanges {
print("word:", word)
print("substring:", test[range])
}
Это напечатает:
слово: а
подстрока: а
слово: лиса
подстрока: лиса
слово: прыгает
подстрока: прыжки
слово: кончено
подстрока: окончено
слово: другой
подстрока: другой
слово: лиса
подстрока: лиса
Итак, вам нужно только первое вхождение слова, если слово дублируется?