Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何使用Swift 3将每个句子中的第一个单词大写?_Xcode_String_Swift3 - Fatal编程技术网

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

Xcode 如何使用Swift 3将每个句子中的第一个单词大写?,xcode,string,swift3,Xcode,String,Swift3,我想把字符串中每个句子的第一个单词大写。例如,此字符串: 苹果园将运行最大的现场太阳能发电站之一 世界各地的设施。它也是世界上最大的 自然通风的建筑物 应成为: 苹果园将运行最大的现场太阳能发电站之一 世界各地的设施。它也是世界上最大的 自然通风的建筑物 我还希望,当一个世界的字符中已经有大写字母时,不会出现大写,例如: iPad是一种移动设备 遗骸 iPad是一种移动设备 对于此任务的第一部分,我可以通过以下方式使用此代码: 但是它是为Swift 2服务的,而不是为Swift 3服务。这就是你

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

苹果园将运行最大的现场太阳能发电站之一 世界各地的设施。它也是世界上最大的 自然通风的建筑物

应成为:

苹果园将运行最大的现场太阳能发电站之一 世界各地的设施。它也是世界上最大的 自然通风的建筑物

我还希望,当一个世界的字符中已经有大写字母时,不会出现大写,例如:

iPad是一种移动设备

遗骸

iPad是一种移动设备

对于此任务的第一部分,我可以通过以下方式使用此代码:


但是它是为Swift 2服务的,而不是为Swift 3服务。

这就是你想要的吗

每个句子都是重复的。对于每个句子中的第一个单词,如果它包含大写字母,则不会发生任何更改,否则,它将大写,并将句子的其余部分附加到结果中

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)
let str=“这是一个没有品牌平板电脑的句子。这也是一个有iPad的句子!iPad在句子开头?”
var result=“”
//重复每个句子
str.uppercased().EnumerateSubstring(in:str.startIndex..
产出:

这是一句没有品牌名为平板电脑的句子。这也是一句话,但里面有iPad!这句话的开头是iPad吗

注意。我没有把重点放在效率上。如果要将其用于大量数据,可能需要先对其进行分析


我不认为
.bycentenses
选项非常健壮。在我的测试中,我不小心在其中一个句子中有两个空格,它无法正确解析。我也试过你的例子“苹果…”的句子,它只找到一个

@JamesWebster哈哈,你明白了。只要将你的Swift 2代码转换成Swift 3代码,它就会工作(文档会给你新的方法名称)-它会像Swift 2一样工作(在每个句子中,第一个字母大写,其余字母小写,可能会丢失一个句子中的大写字母),但如果需要,可以通过改进算法来解决这个问题。抱歉,但这实际上不起作用。试着把你的“这个”改成“这个”,你会发现它失败了。请注意原文使用的是
大写字符串
,但它也比首字母多,因此也不能正常工作。我认为这是
问题的一部分。看起来它实际上是在用大写字母作为新句子的标记。你的句子只有英语吗?也许您可以为句子分析位查找句子结尾标记([.?!)是的,它使用首字母大写作为句子识别的一部分,这就是为什么原始解决方案包含大写和小写转换。@CRD。我再来一次@电话,我修正了。它不应再将字符串的其余部分小写!:)
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)