Swift + 正则表达式

最近心血来潮想挑战一下,做个类似微博可以自动匹配# #话题和@ 提醒的label

整体思路为
1.显示高亮主要是正则表达式 + TextKit
2.点击方法为touchesBegan

一. Swift + 正则表达式

OC 和 Swift 都支持正则表达式

第一步: 创建规则
let string = "Label #hah# #xix#"
let range = NSRange(location: 0, length: string.characters.count)

let pattern = "#[^#]+#"// 匹配 ## 的
第二步: 利用规则创建一个正则表达式对象
/*
 * 第一个参数: 正则表达式的规则
 * 第二个参数: 附加选项
 */
/*
.caseInsensitive: 忽略大小写
.allowCommentsAndWhitespace:忽略空白字符,以及前缀是 # 开始的注释
.ignoreMetacharacters: 将整个匹配方案作为文字字符串
.dotMatchesLineSeparators:允许 . 匹配任意字符,包括回车换行
.anchorsMatchLines: 允许 ^ 和 $ 匹配多行文本的开始和结尾
.useUnixLineSeparators: 仅将 \n 作为换行符
.useUnicodeWordBoundaries: 使用 Unicode TR#29 指定单词边界
*/
let regex = try! NSRegularExpression(pattern: pattern, options: [.caseInsensitive])
第三步: 匹配
// 从指定字符串中取出第一个匹配规则的字符串的范围,返回的是NSTextCheckingResult?类型
let res1 = regex.firstMatch(in: string,  options: [.reportProgress],  range: range)
res1?.range.location // 6
res1?.range.length // 5

// 从指定字符串中取出有多少个匹配规则的字符串,返回的是Int类型
let res2 = regex.numberOfMatches(in: string, options: [.reportProgress], range: range)
res2 // 2

//从指定字符串中取出第一个匹配规则的字符串的范围,返回的是NSRange类型
let res3 = regex.rangeOfFirstMatch(in: string, options: [.reportProgress], range: range)
res3.location // 6
res3.length // 5

// 从指定字符串中取出所有匹配规则的字符串的结果集,返回的是[NSTextCheckingResult]类型
let resArray = regex.matches(in: string, options: [.reportProgress], range: range)

for res in resArray {
    print(res.range.location)
    print(res.range.length)
}

你可能感兴趣的:(Swift + 正则表达式)