关闭

XZ_iOS之正则表达式和简单的图文混排

标签: 正则表达式使用正则表达式查找 URL 的范围数组简单的图文混排取出指定范围内的文字给 UILabel 添加图片的功能
205人阅读 评论(0) 收藏 举报
分类:

正则表达式

有关正则表达式的参考文档链接 http://deerchao.net/tutorials/regex/regex.htm

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

iOS中的使用

最大用处:’匹配’字符串,进行’模糊查找’

  • 正则表达式常用选项

    • CaseInsensitive 忽略大小写

    • DotMatchesLineSeparators .匹配换行符

  • 匹配方案

    • . 匹配任意字符,回车除外
    • * 匹配 0~任意 多个字符
    • ? 尽可能少的重复
    • .*? 可以代替任何字符
  • 匹配函数

    • matchesInString
      • 重复匹配多次 pattern
      • 如果匹配成功,生成 NSTextCheckingResult 数组
    • firstMatchInString
      • 匹配第一个 pattern
      • 如果匹配成功,生成 NSTextCheckingResult
  • 匹配结果

    • numberOfRanges
      • 匹配的 range 计数,查找到的范围数量
      • 如果匹配成功,是()的数量 + 1
    • rangeAtIndex
      • 获取第几个子表达式
      • 指定’索引’位置的范围
1、在Xcode中的使用

将下图中,字典的key值设置为value中的颜色值
这里写图片描述

Replace:”(.?)”: UIColor.(.?),
With:”2":UIColor\.2,
修改完之后的结果:
这里写图片描述

2、取出指定范围内的文字

例如,取出<a href=\"http://www.baidu.com\" rel=\nofollow7\">百度一下</a> 中的链接,以及文本描述

pattern - 常说的正则表达式,就是 pattern 的写法[匹配方案]
索引:
0:和匹配方案完全一致的字符串
1:第一个 () 中的内容
2:第二个 () 中的内容
… 索引从左往右顺序递增

let string = "<a href=\"http://www.baidu.com\" rel=\"nofollow7\">百度一下</a>"
 // 2.创建正则表达式
 let pattern = "<a href=\"(.*?)\".*?>(.*?)</a>"
 // 1>创建正则表达式,如果 pattern 失败,抛出异常
guard let regx = try? NSRegularExpression(pattern: pattern, options: []) else {
    return
}

// 2>进行查找,两种查找方法
// [只找第一个匹配项/查找多个匹配项]
guard let result = regx.firstMatch(in: string, options: [], range: NSRange(location: 0, length: string.characters.count)) else {
    print("没有找到匹配项")
    return
}

print("找到的数量\(result.numberOfRanges)")
// 打印的结果:找到的数量3        

// 3> result 中只有两个重要的方法
// result.numberOfRanges -> 查找到的范围数量
// result.range(at: idx) -> 指定‘索引($2)’位置的范围
for idx in 0..<result.numberOfRanges {

    let range = result.range(at: idx)
    let subStr = (string as NSString).substring(with: range)

    print(range,subStr)
    // 打印的结果:
    /**
    {0, 55} <a href="http://www.baidu.com" rel="nofollow7">百度一下</a>
    {9, 20} http://www.baidu.com
    {47, 4} 百度一下
   */
}
3、使用正则表达式查找 URL 的范围数组

使用匹配 URL 的正则表达式,进行多重匹配,将查找到的范围放在数组 ranges 中,可以查找到字符串中的多个 URL,也可以使用 firstMatch 进行单一匹配

/// 返回 textStorage 中的 URL range 数组
    var urlRanges : [NSRange]? {
        // 1. url 的正则表达式
        let pattern = "[a-zA-Z]*://[a-zA-Z0-9/\\.]*"

        guard let regx = try? NSRegularExpression(pattern: pattern, options: []) else {
            return nil
        }

        // 2.多重匹配
        let matches = regx.matches(in: textStorage.string, options: [], range: NSRange(location: 0, length: textStorage.length))

        // 3.遍历数组,生成 range 的数组
        var ranges = [NSRange]()

        for m in matches {
            ranges.append(m.range(at: 0))
        }

        return ranges
    }

简单的图文混排

简单的图文混排最重要的就是将图片转换为图片属性文本,这就涉及到两个类的结合使用:NSAttributedString 和 NSTextAttachment
可以实现给 UILabel 添加图片的功能

/// 将当前的图像转换成图片属性文本
    func imageText(font: UIFont) -> NSAttributedString {
        // 1.判断图像是否存在
        guard let image = image else {
            return NSAttributedString.init(string: "")
        }

        // 2.创建文本附件
        let attchment = NSTextAttachment()

        attchment.image = image
        let height = font.lineHeight
        // 如果图片太高了,使用下面这句进行设置
        attchment.bounds = CGRect(x: 0, y: -4, width: height, height: height)

        // 3.返回图片属性文本
        return NSAttributedString(attachment: attchment)
    }

实现结果:
这里写图片描述

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

经验之谈—正则表达式实现图文混排

在项目中,我们经常需要发表情,以及经常需要将表情字符转换成表情。因为表情是一个图片,所以我们发给服务器的时候,实际上是发一段特殊的文字给服务器,然后转换成表情。以免浪费用户过多的流量。 那接下来,我们...
  • yi_zz32
  • yi_zz32
  • 2016-01-06 23:08
  • 2386

java简单的正则表达式验证邮箱

package com.kero99.ygc.test;import java.util.regex.Matcher; import java.util.regex.Pattern;public cl...
  • qq_17025903
  • qq_17025903
  • 2017-05-02 16:50
  • 1745

正则表达式DFA构造方法

陈梓瀚 vczh@163.com http://www.cppblog.com/vczh/ 1、问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词法分析独...
  • Chinamming
  • Chinamming
  • 2013-12-06 14:15
  • 11568

iOS 字符中插入按钮(简单图文混排)

需求字符串中某段区域需要添加点击效果或者字符串中添加可点击的按钮。 解决:给UILabel添加点击事件的category。
  • IT_201607
  • IT_201607
  • 2017-07-04 14:25
  • 182

iOS 简单图文混排01

在Label中插入图表或标签,实现qq输入表情的效果。
  • wangxiaoit
  • wangxiaoit
  • 2015-05-25 13:46
  • 4038

iOS实现简单图文混排效果

在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现。现在分享一种比较简单的实现方式 ...
  • zengraoli
  • zengraoli
  • 2013-10-11 13:58
  • 29073

iOS实现简单图文混排效果

在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现。现在分享一种比较简单的实现方式   iO...
  • wuzehai02
  • wuzehai02
  • 2013-07-24 16:45
  • 2709

ios图文混排简单演示

本人做ios开发有些时间了,由于工作忙和自己懒得写,所以一直没有写过技术博客,今日突发奇想,还是写点东西吧,分享给大家。好今天我简单介绍下ios开发中图文混排的一些内容.     图文混排呢说直白点就...
  • joonchen111
  • joonchen111
  • 2015-08-23 17:29
  • 1229

iOS实现简单图文混排效果

在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现。现在分享一种比较简单的实现方式 iOS s...
  • miracle_of_thinking
  • miracle_of_thinking
  • 2012-09-27 11:50
  • 6353

iOS实现简单图文混排效果

在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现。现在分享一种比较简单的实现方式   iO...
  • u014724552
  • u014724552
  • 2014-04-20 22:48
  • 633
    个人资料
    • 访问:56178次
    • 积分:1775
    • 等级:
    • 排名:千里之外
    • 原创:119篇
    • 转载:0篇
    • 译文:2篇
    • 评论:18条
    文章分类
    最新评论