正则表达式入门介绍

作者: vvkeep | 来源:发表于2016-10-07 17:15 被阅读231次

    几乎所有的语言/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)
        }
    }
    

    相关文章

      网友评论

      本文标题:正则表达式入门介绍

      本文链接:https://www.haomeiwen.com/subject/eckyyttx.html