我想在swift中将大写字符串(UPPERCASE)转换为标题案例字符串(Title Case)。我在正则表达式方面不强,但已经找到this使用我试图使用的正则表达式的答案。
搜索表达式为:
"([A-Z])([A-Z]+)\b"
,模板表达式为:
"$1\L$2"
为了在swift中使用它,我已经逃脱了反斜杠,如下所示:
var uppercase = "UPPER CASE STRING"
var titlecase = uppercase.stringByReplacingOccurrencesOfString("([A-Z])([A-Z]+)\\b", withString: "$1\\L$2", options: NSStringCompareOptions.RegularExpressionSearch, range: Range<String.Index>(start: uppercase.startIndex, end: uppercase.endIndex))
上面的代码给出了以下结果:
"ULPPER CLASE SLTRING"
从中您可以看到搜索表达式成功找到了$ 1和$ 2这两个部分,但看起来像是反转了反斜杠会干扰替换。
如何获得预期结果:
"Upper Case String"
答案 0 :(得分:3)
Swift提供了许多有用的现有NSString
方法。这包括capitalizedString
,根据您的要求,它可能完全符合您的要求。
答案 1 :(得分:2)
我知道,标题大小写字符串是每个单词的首字母大写的字符串(介词,冠词和连词除外)。因此,代码应如下所示:
public extension String {
subscript(range: NSRange) -> Substring {
get {
if range.location == NSNotFound {
return ""
} else {
let swiftRange = Range(range, in: self)!
return self[swiftRange]
}
}
}
/// Title-cased string is a string that has the first letter of each word capitalised (except for prepositions, articles and conjunctions)
var localizedTitleCasedString: String {
var newStr: String = ""
// create linguistic tagger
let tagger = NSLinguisticTagger(tagSchemes: [.lexicalClass], options: 0)
let range = NSRange(location: 0, length: self.utf16.count)
tagger.string = self
// enumerate linguistic tags in string
tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: []) { tag, tokenRange, _ in
let word = self[tokenRange]
guard let tag = tag else {
newStr.append(contentsOf: word)
return
}
// conjunctions, prepositions and articles should remain lowercased
if tag == .conjunction || tag == .preposition || tag == .determiner {
newStr.append(contentsOf: word.localizedLowercase)
} else {
// any other words should be capitalized
newStr.append(contentsOf: word.localizedCapitalized)
}
}
return newStr
}
}