Это немного отличается от того, что вы просили, но в зависимости от того, почему вы это делаете, вы можете рассмотреть структуру NaturalLanguage .Например,
import NaturalLanguage
let text = "I am trying to create an array from a sentence. But I don't understand, Why isn't the last fullstop removed, from the last word."
var words: [String] = []
let tagger = NLTagger(tagSchemes: [.lexicalClass])
tagger.string = text
let options: NLTagger.Options = [.omitWhitespace, .joinContractions]
tagger.enumerateTags(in: text.startIndex..<text.endIndex, unit: .word, scheme: .lexicalClass, options: options) { tag, range in
if let tag = tag {
words.append(String(text[range]))
}
return true
}
print(words)
["I", "am", "пытаюсь", "to", "создать", "an", "array", "from", "a","предложение", ".", "но", "я", "не \", "не понимаю", ",", "почему", "не так", "the", "последний","fullstop", "удален", ",", "из", "the", "last", "word", "."]
Что интересно, это то, что tag
свойство расскажет вам части речи, что такое терминатор предложения и т. д., например:
tagger.enumerateTags(in: text.startIndex..<text.endIndex, unit: .word, scheme: .lexicalClass, options: options) { tag, range in
if let tag = tag {
print(text[range], tag.rawValue)
}
return true
}
Производство:
I Местоимениея глаголпытаясь глаголЧастицамсоздать глаголопределительмассив Nounиз предлогаОпределительпредложение существительное,SentenceTerminatorНо соединениеЯ местоимениене глаголпонять глаголПунктуацияПочему местоимениене глаголОпределительпоследнее прилагательноесуществительное fullstopудаленный глаголПунктуацияиз предлогаОпределительпоследнее прилагательноеслово существительное,SentenceTerminator
Или, может быть, вы действительно не заботитесь о пунктуации и просто хотите разбить ее на предложения и предложения на слова:
var sentences: [[String]] = []
let sentenceTokenizer = NLTokenizer(unit: .sentence)
sentenceTokenizer.string = text
sentenceTokenizer.enumerateTokens(in: text.startIndex ..< text.endIndex) { range, _ in
let sentence = String(text[range])
let wordTokenizer = NLTokenizer(unit: .word)
wordTokenizer.string = sentence
let words = wordTokenizer.tokens(for: sentence.startIndex ..< sentence.endIndex)
.map { String(sentence[$0]) }
sentences.append(words)
return true
}
print(sentences)
[[«Я», «Я», «пытаясь», «к», «создать», «an», «массив», «из», «а», «предложение»],[«Но», «я», «не понимаю», «понимаю», «почему», «не является», «то», «последний», «полный ход», «удален», «из», "последнее слово"]]
Здесь есть множество опций от NLTagger
до NLTokenizer
.В зависимости от того, какую проблему вы действительно пытаетесь решить, это может быть лучше, чем манипулирование строками самостоятельно.
Как сказал Султан, вы, очевидно, можете просто вставить пробелы и split
строку, хотя яможет предложить добавить другие символы пунктуации и включить +
для соответствия нескольким или одному символу в случае последовательных знаков пунктуации (особенно эллипсов, ...
), например
let words = text.replacingOccurrences(of: "[,.:;!?]+", with: " $0", options: .regularExpression)
.split(separator: " ")