Swift: преобразование строки в список слов и диапазонов в строке

Скажи, если у меня есть предложение:

a fox jumps over another fox

Мне нужно сопоставить его со списком слов с их соответствующим диапазоном внутри строки, например, первая «лиса» должна сопоставляться с:

["fox", NSRange(2, 3)]

трудность здесь заключается в дублировании слов, таких как два «лиса», я могу проверить индекс каждого слова в строке и удалить слово (из строки) по мере продвижения, но есть ли более умный способ сделать это?

Еще одна задача — когда в слове есть точка, скажем:

a fox jumps over another f.x

если я ищу диапазон для «f.x», вероятно, он также будет соответствовать «лисе»?

Спасибо!

Итак, вам нужно только первое вхождение слова, если слово дублируется?

Sweeper 15.12.2020 03:14

Спасибо @Sweeper. Я хочу, чтобы каждое слово в предложении и их диапазон в предложении, например, два «лиса» в «лиса прыгает через другую лису» должны дать мне («лиса», диапазон1) и («лиса», диапазон2) где range1 и range2 разные.

Heuristic 15.12.2020 03:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
289
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать метод 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])

}

Это напечатает:

слово: а
подстрока: а
слово: лиса
подстрока: лиса
слово: прыгает
подстрока: прыжки
слово: кончено
подстрока: окончено
слово: другой
подстрока: другой
слово: лиса
подстрока: лиса

Другие вопросы по теме