正则表达式
有关正则表达式的参考文档链接:http://deerchao.net/tutorials/regex/regex.htm
iOS 中的使用
-
正则表达式常用选项
CaseInsensitive
忽略大小写DotMatchesLineSeparators
.
匹配换行符
-
匹配方案
.
匹配任意字符*
匹配 0~任意 多个字符?
尽可能少的重复
-
匹配函数
matchesInString
- 重复匹配多次
pattern
- 如果匹配成功,生成
NSTextCheckingResult
数组
- 重复匹配多次
firstMatchInString
- 匹配第一个
pattern
- 如果匹配成功,生成
NSTextCheckingResult
- 匹配第一个
-
匹配结果
numberOfRanges
- 匹配的
range
计数 - 如果匹配成功,是
()
的数量+ 1
- 匹配的
-
rangeAtIndex
0
和pattern
完全匹配的内容1
第一个 () 的内容2
...依次类推
-
可以利用
NSString
的substringWithRange
取得匹配结果
来源处理
- 新浪微博来源字符串格式
<a href=\"http://app.weibo.com/t/feed/310OQS\" rel=\"nofollow\">精彩微客</a>
目标:从一个
html
的href
中提取链接文字 Link Text
需要使用正则表达式
示例代码
let str = "<a href=\"http://app.weibo.com/t/feed/310OQS\" rel=\"nofollow\">精彩微客</a>"
let pattern = "<a href=\"(.*?)\".*?>(.*?)</a>"
let regex = try! NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.DotMatchesLineSeparators)
if let result = regex.firstMatchInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count)) {
print(result.numberOfRanges)
let r1 = result.rangeAtIndex(1)
let r2 = result.rangeAtIndex(2)
print((str as NSString).substringWithRange(r1))
print((str as NSString).substringWithRange(r2))
}
建立分类
func href() -> (link: String?, text: String?) {
let pattern = "<a href=\"(.*?)\".*?>(.*?)</a>"
let str: NSString = self
let regex = try! NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.DotMatchesLineSeparators)
if let result = regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.length)) {
print(result.numberOfRanges)
let r1 = result.rangeAtIndex(1)
let r2 = result.rangeAtIndex(2)
return(str.substringWithRange(r1), str.substringWithRange(r2))
}
return (nil, nil)
}
集成到微博项目
- 将分类拖拽至项目的
Tools
目录 - 修改
Status
模型
/// 微博来源
var source: String? {
didSet {
source = source?.href().text ?? ""
}
}
运行测试 :D