几乎所有的语言/IDE,都支持正则表达式
功能:“匹配”字符串,进行模糊查找
- . 匹配任意字符,回车除外
- * 匹配任意多次, 回车结束
- ?尽量少的匹配
- $1 代表第一个() $2 代表第二个()
- 常用 .*? 代表任意字符串
EXP1:
< a href="http://app.weibo.com/t/feed/3auC5p" rel="nofollow">皮皮时光机</a >
取出href 中的链接 以及文本描述
override func viewDidLoad() {
super.viewDidLoad()
let string = "<a href=\"http://app.weibo.com/t/feed/3auC5p\" rel=\"nofollow\">皮皮时光机</a>"
//pattern - 匹配方案 -正则表达式 "" 需要\转义
//索引:
// 0 和匹配方案完全一致的字符串
// 1 第一个()中的内容
// 2 第二个()中的内容
// 索引从左往右顺序递增
// 对于模糊匹配,如果关心的内容,就可以使用(.*?) 通过索引获取结果
// 若不关系内容 使用 .*? 匹配任意内容
let pattern = "<a href=\"(.*?)\" rel=\".*?>(.*?)</a>"
//创建正则表达式,如果pattern失败,抛出异常
guard let regx = try? NSRegularExpression(pattern: pattern, options: []) else {
return
}
//进行查找,两种查找方法:只找一个匹配项/查找多个匹配项
guard let result = regx.firstMatch(in: string, options: [], range: NSRange(location: 0, length: string.characters.count)) else {
print("没有找到匹配项")
return
}
//result.numberOfRanges ->查找到的范围数量
//result.rangeAt(idx) ->指定索引位置的范围
print("找到的数量\(result.numberOfRanges)")
for idx in 0..<result.numberOfRanges {
let r = result.rangeAt(idx)
let subStr = (string as NSString).substring(with: r)
print("\(idx)---\(subStr)")
}
}
像这样的匹配,在项目中,我们一般抽取出来,作为一个分类方法。
extension String {
/// 从当前的字符串中,提取链接和文本
/// Swift中提供了’元祖‘,同时返回多个值
/// OC 中可以返回字典,或者自定义对象,也可以用指针的指针
func yw_href() -> ((link: String, text: String))? {
//匹配方案
let pattern = "<a href=\"(.*?)\".*?>(.*?)</a>"
// 创建正则表达式
guard let regx = try? NSRegularExpression(pattern: pattern, options: []),
let result = regx.firstMatch(in: self, options: [], range: NSRange(location: 0, length: characters.count))else {
return nil
}
//获取结果
let link = (self as NSString).substring(with: result.rangeAt(1))
let text = (self as NSString).substring(with: result.rangeAt(2))
return(link,text)
}
}