iOSiOS基础·OC语法篇iOS程序猿

正则表达式入门介绍

2016-10-07  本文已影响231人  vvkeep

几乎所有的语言/IDE,都支持正则表达式

功能:“匹配”字符串,进行模糊查找

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)
    }
}
上一篇下一篇

猜你喜欢

热点阅读