我想将字符串中每个句子的第一个单词大写。例如,这个字符串:
苹果公园将运行最大的现场太阳能之一 世界上的装置。它也是世界上最大的网站 自然通风的建筑。
应该成为:
Apple Park将运行最大的现场太阳能之一 世界上的装置。它也是世界上最大的网站 自然通风的建筑。
我还希望当一个世界的角色中有一个大写字母时,大写不会发生,例如:
iPad是移动设备。
遗迹
iPad是移动设备。
对于此任务的第一部分,我可以通过rintaro使用此代码:
let str = "someSentenceWith UTF text İŞğĞ. anotherSentenceğüÜğ"
var result = ""
str.uppercaseString.enumerateSubstringsInRange(str.characters.indices, options: .BySentences) { (sub, _, _, _) in
result += String(sub!.characters.prefix(1))
result += String(sub!.characters.dropFirst(1)).lowercaseString
}
print(result)
但它适用于Swift 2并且不适用于Swift 3。
答案 0 :(得分:1)
这就是你要追求的吗?
每个句子都是迭代的。对于每个句子中的第一个单词,如果它包含大写字母,则不会发生任何变化,否则,它会被大写,并且句子的其余部分将附加到结果中。
let str = "this is a sentence without a brand named tablet. this too is a sentence but with iPad in it! iPad at start of sentence here?"
var result = ""
//Iterate each sentence
str.uppercased().enumerateSubstrings(in: str.startIndex ..< str.endIndex, options: .bySentences) { substring, range, _, _ in
var original = str.substring(with: range)
var capitalize = true
//Iterate each word in the sentence
substring!.enumerateSubstrings(in: substring!.startIndex ..< substring!.endIndex, options: .byWords) { word, wordRange , _ , stop in
var originalWord = original.substring(with: wordRange)
//If there is a capital letter in that word, don't capitalize it
for character in originalWord.characters {
if String(character).uppercased().characters.first == character {
capitalize = false
break
}
}
//But always stop after the first word. It's the only one of concern
stop = true
}
//Modify the first word if needed
if capitalize {
result += String(original.characters.prefix(1)).uppercased()
result += String(original.characters.dropFirst(1))
}
else {
result += original
}
}
print(result)
输出:
这是一个没有名牌平板电脑的句子。这也是一句话,但在iPad中! iPad开头的句子在这里?
NB。我没有关注这里的效率。如果您打算将其用于大量数据,您可能需要先对其进行分析!
我不认为.bySentences
选项非常强大。在我测试期间,我意外地在其中一个句子中有两个空格,但无法正确解析。我也试过你的例子“Apple ...”句子,它只找到一个。