iOS中要进行文本操作,如截取,trim等,CharacterSet是很重要的一个环节。iOS中用CharacterSet来表示一组Unicode的集合,它经常和Scanner,NSPredicate配合使用。
这里是SDK提供的常用CharacterSet
CharacterSet.alphanumerics // 字母和数字的组合,包含大小写, 不包含小数点
CharacterSet.decimalDigits // 0-9的数字,也不包含小数点
CharacterSet.controlCharacters // ASCII 码0-31号字符,详见http://ascii.cl/control-characters.htm
CharacterSet.whitespaces // 空格
CharacterSet.whitespacesAndNewlines // 空格和换行
CharacterSet.letters //所有英文字母,包含大小写 65-90 97-122
CharacterSet.lowercaseLetters // 小写英文字母 97-122
CharacterSet.uppercaseLetters // 大写英文字母 65-90
// 通用字符类别划分详见 https://msdn.microsoft.com/zh-cn/library/20bw873z(v=vs.110).aspx
CharacterSet.nonBaseCharacters // Returns a character set containing the characters in Unicode General Category M*.
CharacterSet.decomposables // 没搞懂,也没用过,同音字母可以用这个?
CharacterSet.illegalCharacters // 不合规字符,没有在Unicode 3.2 标准中定义的字符
CharacterSet.punctuationCharacters // 标点符号,连接线,引号什么的 P*
CharacterSet.symbols // 符号,包含S* 所有内容,运算符,货币符号什么的
CharacterSet.capitalizedLetters // 字母,首字母大写,Lt类别
CharacterSet.newlines // 返回一个包含换行符的字符集,`U+000A ~ U+000D`, `U+0085`, `U+2028`, and `U+2029`
CharacterSet.urlHostAllowed // URL 中Host子模块中允许的字符集.
CharacterSet.urlPathAllowed // URL 中domain后面的路径子模块中允许的字符集.
CharacterSet.urlUserAllowed // URL 中用户子模块中允许的字符集.
CharacterSet.urlQueryAllowed // URL中请求信息子模块中允许的字符集.
CharacterSet.urlFragmentAllowed // 片段URL子模块中允许的字符集.
CharacterSet.urlPasswordAllowed // URL中密码子模块中允许的字符集.
手动创建CharacterSet的一些方法
CharacterSet(charactersIn: "Hello") // 通过字符串创建CharacterSet
let dot = ".".unicodeScalars
let range = dot[dot.startIndex]...dot[dot.startIndex]
let dotSet = CharacterSet(charactersIn: range) // 通过range创建CharacterSet,此处创建的为只包含"."字符的CharacterSet
let exceptDotSet = dotSet.inverted // 反转,得到除.以外的字符集
// 此处可以通过range创建比如大于5的数字,D-X的字母合集等
let dWord = "D".unicodeScalars
let xWord = "X".unicodeScalars
let wordRange = dWord[dWord.startIndex]...xWord[xWord.startIndex]
let wordSet = CharacterSet(charactersIn: wordRange)
// 通过位图创建CharacterSet,字符集的原始位图表示是表示基本多语言(BMP)的代码点范围的前2 ^ 16位(即8192字节)的字节数组
let bitmapRep = Data(count: 8192)
CharacterSet(bitmapRepresentation: bitmapRep)
判断字符集的包含关系和父子关系
dotSet.contains(dot[dot.startIndex]) // 包含
dotSet.contains(UnicodeScalar(65)/*字母A*/) // 不包含
// 判断是否为SuperSet,另一种包含关系
CharacterSet.letters.isSuperset(of: CharacterSet.alphanumerics)
CharacterSet.alphanumerics.isSuperset(of: CharacterSet.letters)
CharacterSet的运算操作
let hellSet = CharacterSet(charactersIn: "Hell")
var lleoSet = CharacterSet(charactersIn: "lleo")
lleoSet.remove(charactersIn: "e") // -> l, o
lleoSet.insert(charactersIn: "e") // -> l, e, o
lleoSet.union(hellSet) // 两个组合起来 -> H, l, e, o
lleoSet.intersection(hellSet) // 两个set的交集 -> l, e
lleoSet.inverted // 取反,出去 l, e, o外的所有字符
一些实际的运用
/ 去除首尾多余的字符,此处为空格
str.trimmingCharacters(in: CharacterSet.whitespaces)
// 通过数字将字符串转换为数组
"a1aa2aaa3aaaa4aaaaa".components(separatedBy: CharacterSet.decimalDigits)
// 去掉一段字符里面多余的空格, 这个东西在一大段字里面空格打多了的情况下很好用
var trimmingSpaceStr = str.trimmingCharacters(in: CharacterSet.whitespaces) // 去除首尾空格
var array = trimmingSpaceStr.components(separatedBy: CharacterSet.whitespaces) // 通过空格转换为数组
let predicate = NSPredicate(format: "self <> ''") // 不等于空字符串
do {
try array.filter { (string) -> Bool in
predicate.evaluate(with: string) // 去掉多余的空格,如果等于空字符串就不要这个
}.joined(separator: " ")
}
catch {
}