2

NSStringに組み込まれているconvertStringToTitleCaseメソッドを使用して開始する次のメソッドを作成しましたが、実際には各単語の最初の文字を大文字にするだけです。.NETには、TextInfo.ToTitleCaseのメソッドがあり、Objective-Cでやりたいことを試みますが、不十分です。

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

私が始めに書いた方法は以下の通りです。大文字の文字列を適切にケーシングするにはどうすればよいですか?すべて大文字/小文字に変換する単語のデータベースは役に立ちますか?

- (NSString *)convertStringToTitleCase:(NSString *)str {
    NSMutableString *convertedStr = [NSMutableString stringWithString:[str capitalizedString]];

    NSRange range = NSMakeRange(0, convertedStr.length);

    // a list of words to always make lowercase could be placed here
    [convertedStr replaceOccurrencesOfString:@" De " 
                                  withString:@" de " 
                                     options:NSLiteralSearch 
                                       range:range];

    // a list of words to always make uppercase could be placed here
    [convertedStr replaceOccurrencesOfString:@" Tv " 
                                  withString:@" TV " 
                                     options:NSLiteralSearch 
                                       range:range];

    return convertedStr;
}
4

3 に答える 3

6

コメントに記載されているように、参照する.NETメソッドは、「適切な」タイトルの大文字小文字を区別しません(つまり、すべて大文字またはすべて小文字のいずれかで残される例外単語のリストに従います)-[NSString capitalizedString]。あなたが得るでしょう。例外的な単語が必要な場合は、独自のメソッドを作成する必要があります(または、グーグルで検索しNSString "title case"たように、他の誰かを検索する必要があります)。

タイトルの大文字と小文字がどの程度「適切」になるかは、それに投げる例外単語の数によって異なります。どのくらいの英語をサポートしてほしいですか?他の言語はどうですか?また、単語の境界を分析する際の距離にも依存します。引用符や文の終わりなどに関係なく、「TV」はすべて大文字のままにしておきたい場合がありますが、おそらくそうではありません。 「You've」が「You'Ve」に出て欲しい。

例外ワードを処理する場合、繰り返し実行replaceOccurrencesOfString...する計画は、例外ワードが多いほど遅くなります。(また、検索/置換文字列でスペースを使用することは、他の単語の境界を考慮していないことを意味します。)

NSRegularExpression正規表現にはすでに大文字と小文字の境界と単語の境界についてかなり堅牢な概念があるため、を検討すると便利な場合があります。それがうまくいかない場合は、スキャナーを使用して入力文字列を読み取り、変換された出力文字列を生成する方が、複数の検索/置換操作を実行するよりも効率的です。

于 2012-04-16T20:03:37.583 に答える
6

素晴らしいワンライナー(一般的な解決策ではなく、巨大な文字列ではおそらく非常に非効率的です):

[[str lowercaseString] capitalizedString];
于 2015-06-02T02:33:39.637 に答える
1
extension String {

    /**
      Get the title case string.
     */
    var titleCase: String {
        get {
            return getTitleCaseString()
        }
    }

    // MARK: Private methods.

    /**
     Get title case string.

     - returns: The title case string regarding the lowercase words.
     */
    private func getTitleCaseString() -> String {
        struct Holder {
            static let lowercaseWords = ["a", "an", "and", "at", "but", "by", "else", "for",
                                         "from", "if", "in", "into", "is", "nor", "of", "off",
                                         "on", "or", "out", "the", "to", "via", "vs", "with"]
        }
        return replaceToLowercaseAllOccurrencesOfWords(Holder.lowercaseWords).capitalizeFirst
    }

    /**
     Replace to lowercase all occurrences of lowercase words.

     - parameter lowercaseWords: The lowercase words to replace.

     - returns: String with all occurrences replace to the lowercase words.
     */
    private func replaceToLowercaseAllOccurrencesOfWords(lowercaseWords: [String]) -> String {
        let capitalizedSelf = NSMutableString(string: self.capitalizedString)
        for word in lowercaseWords {
            if let lowercaseWordRegex = try? NSRegularExpression(pattern: "\\b\(word)\\b", options: .CaseInsensitive) {
                lowercaseWordRegex.replaceMatchesInString(capitalizedSelf,
                                                          options: NSMatchingOptions(),
                                                          range: NSMakeRange(0, capitalizedSelf.length),
                                                          withTemplate: word)
            }
        }
        return capitalizedSelf as String
    }

/**
     Capitalize first char.
     */
    private var capitalizeFirst: String {
        if isEmpty { return "" }
        var result = self
        result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).uppercaseString)
        return result
    }

}
于 2016-06-06T12:24:58.080 に答える