如何使用Swift 3将每个句子中的第一个单词大写?

时间:2017-03-14 08:44:49

标签: xcode string swift3

我想将字符串中每个句子的第一个单词大写。例如,这个字符串:

  苹果公园将运行最大的现场太阳能之一   世界上的装置。它也是世界上最大的网站   自然通风的建筑。

应该成为:

  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。

1 个答案:

答案 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 ...”句子,它只找到一个。