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)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容