iOS中要进行文本操作,如截取,trim等,CharacterSet是很重要的一个环节。iOS中用CharacterSet来表示一组Unicode的集合,它经常和Scanner,NSPredicate配合使用。
这里是SDK提供的常用CharacterSet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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的一些方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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) |
判断字符集的包含关系和父子关系
1 2 3 4 5 6 7 | dotSet.contains(dot[dot.startIndex]) // 包含 dotSet.contains(UnicodeScalar(65)/*字母A*/) // 不包含 // 判断是否为SuperSet,另一种包含关系 CharacterSet.letters.isSuperset(of: CharacterSet.alphanumerics) CharacterSet.alphanumerics.isSuperset(of: CharacterSet.letters) |
CharacterSet的运算操作
1 2 3 4 5 6 7 8 9 10 | 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外的所有字符 |
一些实际的运用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 去除首尾多余的字符,此处为空格 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 { } |