在 Swift 中使用字符分隔符查找并突出显示文本

2024-03-19

我之前开发了一个 Android 应用程序,作为用户的参考指南。它使用 sqlite 数据库来存储信息。数据库存储不带格式的 UTF-8 文本(即粗体或下划线)

为了突出显示文本的哪些部分需要格式化,我使用分隔符标记(特别是 $$)将它们括起来,因为这不会作为信息出现在数据库中。在向用户显示文本之前,我编写了一个方法来查找这些分隔符并向其中包含的文本添加格式并删除分隔符。所以 $$foo$$ 变成了foo.

我的java代码如下:

private static CharSequence boldUnderlineText(CharSequence text, String token) {
    int tokenLen = token.length();
    int start = text.toString().indexOf(token) + tokenLen;
    int end = text.toString().indexOf(token, start);

    while (start > -1 && end > -1)
    {
        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
        //add the formatting required
        spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, 0);
        spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, 0);

        // Delete the tokens before and after the span
        spannableStringBuilder.delete(end, end + tokenLen);
        spannableStringBuilder.delete(start - tokenLen, start);
        text = spannableStringBuilder;

        start = text.toString().indexOf(token, end - tokenLen - tokenLen) + tokenLen;
        end = text.toString().indexOf(token, start);
    }

    return text;
}

我已经在 Swift for iOS 中重新创建了我的应用程序,除了显示正确的格式之外,它是完整的。看来 Swift 处理字符串的方式与其他语言不同。

到目前为止,我已经尝试对原始未格式化段落使用 NSString 和 String 类型,并设法获取第一个分隔符的范围、开始和结束索引:

func applyFormatting2(noFormatString: NSString, delimiter: String){
    let paragraphLength: Int = noFormatString.length //length of paragraph
    let tokenLength: Int = delimiter.characters.count //length of token

    let rangeOfToken = noFormatString.rangeOfString(formatToken) //range of the first delimiter
    let startOfToken = rangeOfToken.toRange()?.startIndex //start index of first delimiter
    let endOfToken = rangeOfToken.toRange()?.endIndex //end index of first delimiter

    var startOfFormatting = endOfToken //where to start the edit (end index of first delimiter)



}

OR

func applyFormatting(noFormatString: String, token: String){
    let paragraphLength: Int = noFormatString.characters.count
    let tokenLength: Int = token.characters.count   //length of the $$ Token (2)
    let rangeOfToken = noFormatString.rangeOfString(formatToken)    //The range of the first instance of $$ in the no format string
    let startOfToken = rangeOfToken?.startIndex //the starting index of the found range for the found instance of $$
    let endOfToken = rangeOfToken?.endIndex //the starting index of the found range for the found instance of $$


    var startOfFormatting = endOfToken
}

我很欣赏这段代码冗长且具有毫无意义的变量,但它可以帮助我在解决问题时思考我的代码。

我目前正在努力研究如何找到第二个/结束分隔符。我想从特定索引搜索字符串,就像我在 Java 中使用该行所做的那样

int end = text.toString().indexOf(token, start);

但是我无法弄清楚如何使用范围来做到这一点。

谁能帮我解决如何正确识别结束分隔符的位置或如何完成代码块以格式化所有必需的文本?

Thanks

Aldo


使用 NSRegularExpression 怎么样?

public extension NSMutableAttributedString {
    func addAttributes(attrs: [String : AnyObject], delimiter: String) throws {
        let escaped = NSRegularExpression.escapedPatternForString(delimiter)
        let regex = try NSRegularExpression(pattern:"\(escaped)(.*?)\(escaped)", options: [])

        var offset = 0
        regex.enumerateMatchesInString(string, options: [], range: NSRange(location: 0, length: string.characters.count)) { (result, flags, stop) -> Void in
            guard let result = result else {
                return
            }

            let range = NSRange(location: result.range.location + offset, length: result.range.length)
            self.addAttributes(attrs, range: range)
            let replacement = regex.replacementStringForResult(result, inString: self.string, offset: offset, template: "$1")
            self.replaceCharactersInRange(range, withString: replacement)
            offset -= (2 * delimiter.characters.count)
        }
    }
}

这是你如何称呼它。

let string = NSMutableAttributedString(string:"Here is some $$bold$$ text that should be $$emphasized$$")
let attributes = [NSFontAttributeName: UIFont.boldSystemFontOfSize(15)]
try! string.addAttributes(attributes, delimiter: "$$")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中使用字符分隔符查找并突出显示文本 的相关文章

随机推荐

  • 如何在 Python 中写入原始二进制数据?

    我有一个 Python 程序 可以存储数据并将数据写入文件 数据是原始二进制数据 内部存储为str 我正在通过 utf 8 编解码器将其写出来 但是 我得到UnicodeDecodeError charmap codec can t dec
  • 使用 ASP.Net 2.0 创建 SOAP 请求

    我正在与服务器网站的技术联系人交谈 他希望我使用 Visual Studio 而我只想手写脚本 请参阅下文了解我需要生成的 SOAP 请求 我已将实际 URL 替换为虚拟 URL 正如您可能猜到的那样 我对 ASP 和 SOAP 还很陌生
  • Wagtail 文档:大文件(>2GB)上传失败

    我正在尝试使用 Wagtail 应用程序中内置的 wagtaildocs 应用程序上传文件 我已经使用 Nginx 的 Digital Ocean 教程方法设置了 Ubuntu 16 04 服务器 鳐鱼 Postgres 一些初步澄清 在我
  • 包签名与之前安装的版本不匹配

    这是我的项目 https github com kenpeter my hak news https github com kenpeter my hak news 它是直接复制https github com grigio HAgnost
  • Google Map API V3.0 - 如何检测 MapTypeId 更改

    要添加侦听器来检测缩放更改 请执行以下操作 google maps event addListener map zoom changed function 检测地图类型变化的代码是什么ROADMAP到另一个视图 例如SATELLITE 我可
  • .net/C# 中的网络

    有人可以为我指明学习如何在 C net 3 5 中进行网络连接的正确方向吗 欢迎提供代码示例和解释 基本上我正在寻找如何进行异步 多线程服务器 客户端模型 我对如何使用 WinSock 在 C 中实现这一点的基础知识相当满意 但尽管我所有的
  • 检测 osx 何时睡眠/从睡眠中恢复

    是否可以编写一个 python 程序 我认为我将作为守护进程运行 来检测 osx 何时进入睡眠状态以及何时从睡眠状态恢复 如果听起来我没有研究过这一点 我很抱歉 我已经超出了我的舒适区 不确定我是否需要从 python 委托给用 C 编写的
  • 如何在Python中以相同比例在同一图形上绘制两个3D矩阵图

    我有两个矩阵 我希望在同一个图上的两个子图上有相应的两个 3D 图 并且具有相同的 z 轴 到目前为止 这是我的代码 import numpy as np import matplotlib pyplot as plt from mpl t
  • 奇怪的海湾合作委员会行为

    给出以下 C 代码 struct vertex type float x y z vertex type vertex type float x float y float z x x y y z z typedef struct vert
  • 如何将包安装到 conda 创建的特定 virtualenv 中 [重复]

    这个问题在这里已经有答案了 我想在 conda 创建 virtualenv 后安装 python 包 但我收到以下错误 有谁知道如何将软件包安装到 conda 创建的 virtualenv 中 Users jzhang anaconda l
  • Java中的ConcurrentHashMap?

    有什么用ConcurrentHashMap在Java中 它有什么好处 它是如何工作的 示例代码也很有用 重点是提供一个实现HashMap那是线程安全的 多个线程可以读取和写入它 而不会接收到过期或损坏的数据 ConcurrentHashMa
  • 基于声明的安全性时的 http 客户端标头授权

    我正在从使用基于声明的安全性的 MVC 应用程序调用 REST api 我将如何设置身份验证标头 我没有密码 所以我想我不应该使用 Basic 如果使用 Bearer 如何获取令牌 Client DefaultRequestHeaders
  • 向 Magento 的订阅模块添加自定义字段

    Magento 中的新闻通讯订阅模块默认只有一个字段 电子邮件 在我向表单添加额外字段 例如国家 地区 后 如何让表单数据显示在 Magento 后端并作为电子邮件发送给预设收件人 谢谢 如果您想为 Magento 新闻通讯订阅者添加一些自
  • 使用 matplotlib 绘制类似 Python 极地时钟的图

    我正在尝试使用 Python 中的 matplotlib 以顺时针方式绘制数据 其风格为这个答案 https stackoverflow com questions 25898523 how to plot points on a cloc
  • 当 AutoGenerateColumns 为 nullable bool 时,WPF DataGrid 强制绑定 DataGridCheckBoxColumn

    我们有很多DataGrid具有动态数据绑定 所以我们总是使用AutoGenerateColumns True For bool列生成一个DataGridCheckBoxColumn但对于可为 null 的 bool bool 在 C 中 生
  • C++ 中的 Utf-8:快速而肮脏的技巧

    我知道有关于 utf 8 的各种问题 主要是关于操作 utf 8 字符串 之类对象的库 然而 我正在开发一个 国际化 项目 一个网站 我在其中编写了 c 后端 不要问 即使我们处理 utf 8 我们实际上也不需要这样的库 大多数时候 简单的
  • 如何从 Google Places API 获取菜单和产品列表的数据?

    在 Google 地图上 企业可以将菜单中的产品详细信息或食品 菜肴 添加到其商店或餐厅 地点 我们如何获得这些数据 在里面Google Place Api 地点详细信息 https developers google com places
  • 无法创建新的 Spree 应用程序:“未定义方法‘raise_in_transactional_callbacks=’”

    几个月前我就遇到过这个问题将其发布到 Spree 的 GitHub 页面上 https github com spree spree issues 5448 然后自己找出解决方案并将其发布在同一问题上 两个月后 我仍然收到来自具有相同错误消
  • 防止伪元素触发悬停?

    如果我有标记 div class a b div 其中 a 类有一个与之关联的悬停类 并且 b 类有一个与之关联的伪元素 就像这样 div width 100px height 100px a background red display
  • 在 Swift 中使用字符分隔符查找并突出显示文本

    我之前开发了一个 Android 应用程序 作为用户的参考指南 它使用 sqlite 数据库来存储信息 数据库存储不带格式的 UTF 8 文本 即粗体或下划线 为了突出显示文本的哪些部分需要格式化 我使用分隔符标记 特别是 将它们括起来 因