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 {
    
}