A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Simpon 中级黑马   /  2016-10-11 14:16  /  3318 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Simpon 于 2016-10-19 11:33 编辑

原文出处:http://www.jianshu.com/p/1c6f58f06922
几乎所有的语言/IDE,都支持正则表达式
功能:“匹配”字符串,进行模糊查找
  • .  匹配任意字符,回车除外
  • *  匹配任意多次, 回车结束
  • ?尽量少的匹配
  • $1 代表第一个() $2 代表第二个()
  • 常用 .*? 代表任意字符串
EXP1:
< a href=\"http://app.weibo.com/t/feed/3auC5p\" rel=\"nofollow\">皮皮时光机</a >
取出href 中的链接 以及文本描述
[Objective-C] 纯文本查看 复制代码
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)")
    }
}
像这样的匹配,在项目中,我们一般抽取出来,作为一个分类方法。
[Objective-C] 纯文本查看 复制代码
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)
    }
}



精华推荐:



1 个回复

倒序浏览
正则是真的很好用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马