【问题标题】:How to capitalize first word in every sentence with Swift 3?如何使用 Swift 3 将每个句子中的第一个单词大写?
【发布时间】:2017-03-14 08:44:48
【问题描述】:

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

apple Park 将运行最大的现场太阳能之一 世界上的装置。它也是世界上最大的 自然通风的建筑。

应该变成:

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。

【问题讨论】:

  • @JamesWebster 哈哈,你明白了。
  • 只需将您的 Swift 2 代码转换为 Swift 3 代码,它就可以工作(文档将为您提供新的方法名称)——它会像在 Swift 2 中一样工作(在每个句子中)它将第一个字母大写,其余字母小写,可能会在句子中丢失大写字母),但如果需要,您可以通过改进算法来解决这个问题。 HTH

标签: xcode string swift3


【解决方案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 在此处的句子开头?

注意。我在这里没有关注效率。如果您打算将其用于大量数据,您可能需要先对其进行分析!

注意

我不认为.bySentences 选项非常强大。在我的测试过程中,我不小心在其中一个句子中有两个空格,并且无法正确解析。我也刚刚尝试过您的示例“Apple ...”句子,它只找到一个。

【讨论】:

  • 抱歉,这实际上不起作用。尝试将您的“THIS”更改为“this”,您会发现它失败了。请注意原版使用uppercaseString,但它也比最初的字母更多,所以它也不能正常工作。
  • 我认为这是我提到的.bySentences 问题的一部分。似乎它实际上是使用大写字母作为新句子的标记。你的句子只有英文吗?也许您可以为句子解析位寻找句子结束标记([.?!, etc])
  • 是的,它使用首字母大写作为其句子识别的一部分,这就是原始解决方案包含大小写转换的原因。
  • @CRD。我再试一次!
  • @Tel,我已经修改了。它不应该再小写字符串的其余部分! :)
猜你喜欢
  • 2015-05-30
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多