在 Swift 中更改属性字符串的文本并保留属性

2024-01-28

对于数据库程序中的输出,我插入了某些文本标记以指示粗体或斜体,以及一些替换图像的文本。例如:

“%Important%^所有员工到休息室^”的最终输出应为:

重要的 所有员工到休息室

我编写了代码来查找周围带有“%”符号和“^”符号的文本,但我现在遇到的问题是文本输出,例如:

%重要的% ^所有员工到休息室^

我想删除这些 % 和 ^,同时保留字符串的格式。

这是我正在使用的代码,直到它崩溃:

func processText(inString string: String) -> NSAttributedString {

let pattern = ["(?<=\\^).*?(?=\\^)","(?<=\\%).*?(?=\\%)","\\^", "\\%"]
let italicsRegex = NSRegularExpression(pattern: pattern[0], options: .allZeros, error: nil)
let range = NSMakeRange(0, count(string))
let italicsMatches = italicsRegex?.matchesInString(string, options: .allZeros, range: range) as? [NSTextCheckingResult]

var attributedText = NSMutableAttributedString(string: string)

for match in italicsMatches! {
    attributedText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Oblique", size: 14.0)!, range: match.range)
}

let boldRegex = NSRegularExpression(pattern: pattern[1], options: .allZeros, error: nil)
let boldMatches = boldRegex?.matchesInString(string, options: .allZeros, range: range) as? [NSTextCheckingResult]

for match in boldMatches!   {
    attributedText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: match.range)
}

let removeItalicsMarksRegex = NSRegularExpression(pattern: pattern[2], options: .allZeros, error: nil)
let removeItalicsMarksMatches = removeItalicsMarksRegex?.matchesInString(string, options: .allZeros, range: range) as? [NSTextCheckingResult]

var numberOfLoops = 0
for match in removeItalicsMarksMatches! {

    attributedText.replaceCharactersInRange(match.range, withString: "")

}

return attributedText.copy() as! NSAttributedString
}

这适用于 % 匹配(但仅适用于第一个字符),并会立即导致 ^ 字符崩溃。

任何解决此问题的帮助或建议将不胜感激。谢谢。


Martin,

我最终使用了非常相似的东西,但我决定更改正则表达式以包含 ^ 标记。这样做时,我能够使用“replaceCharactersInRange”方法剪辑所包含的属性子字符串的第一个和最后一个字符。到目前为止,这对我的目的来说效果更好一些,因为它是根据属性字符串工作的,所以它不会搞砸或删除它的任何属性。

我附上了正则表达式和处理斜体的代码部分,供任何人将来参考(再次感谢!):

func processText(inString string: String) -> NSAttributedString {

let pattern = ["\\^.*?\\^"] //Presented as an array here because in the full code there are a lot of patterns that are run.




let italicsRegex = NSRegularExpression(pattern: pattern[0], options: .allZeros, error: nil) 

//In addition to building the match for this first regular expression, I also gather build the regular expressions and gather matches for all other matching patterns on the initial string ("string") before I start doing any processing.

    let range = NSMakeRange(0, count(string.utf16))

let italicsMatches = italicsRegex?.matchesInString(string, options: .allZeros, range: range) as? [NSTextCheckingResult]

var attributedText = NSMutableAttributedString(string: string)

var charactersRemovedFromString = 0

for match in italicsMatches! {

    let newRange = NSMakeRange(match.range.location - charactersRemovedFromString, match.range.length) // Take the updated range for when this loop iterates, otherwise this crashes.
    attributedText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Oblique", size: 12.0)!, range: newRange)

    let rangeOfFirstCharacter = NSMakeRange(match.range.location - charactersRemovedFromString, 1)

    attributedText.replaceCharactersInRange(rangeOfFirstCharacter, withString: "")

    charactersRemovedFromString += 2

    let rangeOfLastCharacter = NSMakeRange(match.range.location + match.range.length - charactersRemovedFromString, 1)

    attributedText.replaceCharactersInRange(rangeOfLastCharacter, withString: "")
    }

return attributedText
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中更改属性字符串的文本并保留属性 的相关文章

  • 在completionHandlers中存储值 - Swift

    我正在创建一个completionHandler它返回一个字典 但是当我在另一个类中调用这个方法时 它的值是零 func fetchLatestPosts completionHandler responseDict NSDictionar
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • 在 Firebase 中构建聊天应用的数据

    我正在关注 Firebase 指南结构化数据 https firebase google com docs database ios structure data flatten data structures对于聊天应用程序 他们建议的结
  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • Swift 包管理器:“多个目标名为...”

    我正在尝试构建一个服务器端 Swift Web 应用程序 我的应用程序的基础框架将是Kitura https www kitura io来自IBM 此外 我还想利用AWS SDK Swift https github com noppoMa
  • SwiftUI - 预览时未知的预览提供程序“ContentView_Previews_”。发生在一个全新的项目中

    我有这个简单的观点 import SwiftUI struct ContentView View var body some View Text Hello struct ContentView Previews PreviewProvid
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • 使用prepareForSegue传递数据

    我试图将数据从viewController 1传递到viewController2 我有2个按钮和1个segue 因此有一个segue标识符 这2个按钮 按下时每个按钮应显示 1个标签用于显示标题 1个textView用于显示定义 我很难显
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • 快速钥匙串更新只有在第二次尝试时才起作用

    您好 我在更新存储在钥匙串中的登录信息方面遇到了 iOS 钥匙串的一个非常奇怪的问题 因此 如果没有保存的凭据 则正确运行保存函数会保存登录信息 如果登录信息已存在并且用户更新了密码 则更新功能仅正确更新密码 但是 如果登录信息存在并且我尝
  • 来自索引范围 Swift 的新数组

    我怎样才能做这样的事情 从数组中取出前 n 个元素 newNumbers numbers 0 n 目前出现以下错误 error could not find an overload for subscript that accepts th
  • 如何在 Swift 中使用 CoreBluetooth 更新 BLE 设备的电池电量?

    func peripheral peripheral CBPeripheral didDiscoverCharacteristicsFor service CBService error Error for c in service cha
  • NHibernate 获取 & 字符串 Id

    我在 NHibernate 上有一个分配了字符串 Id 的实体 并且在通过 Id 获取实体时遇到了一些问题 例子 假设有这样的数据库记录 Id Description AAA MyDescription 现在 如果我使用搜索 ID aaa
  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认
  • 十六进制字符串的运行长度编码(包括换行符)

    我正在使用以下方法实现游程长度编码GZipStreamC winforms 应用程序中的类 数据以一系列由换行符分隔的字符串形式提供 如下所示 FFFFFFFF FFFFFEFF FDFFFFFF 00FFFFFF 在压缩之前 我将字符串转
  • 生成逗号分隔值

    假设我有一个字符串集合 foo bar xyz 我想从列表中生成一个逗号分隔的值 如下所示 foo bar xyz 请注意末尾缺少 我知道有多种方法可以生成此内容 使用 for 循环和 string Format 或 StringBuild
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • 领域:结果 和列表

    是否可以转换Results
  • WKWebview 中的 iCLoud 文档选择器关闭容器视图

    我有一个 WKWebview 加载基于 Web 的 UI 我希望用户能够从其 iCloud 文档上传文件 我已授予正确的权限 并且可以浏览 iCloud 文档 但是 当我选择文件或单击取消按钮时 文档选择器视图也会关闭 WKWebview

随机推荐

  • 为什么 bash 按字典顺序而不是数字来评估数字比较?

    有人可以解释一下 if 重击块 我使用下面的简单代码检查是否第一个值小于第二个值 first value 67 second value 2 if first value lt second value then echo Yes else
  • WiX .NET Bootstrapper - 功能选择

    我们正在尝试获取自定义 NET Bootstrapper 以便通过我们的 WiX 安装程序有选择地安装 MSI 包中的功能 注册了 PlanMsiFeature 事件后 我们认为我们将能够访问 MSI 中的功能并根据预设条件排除某些功能 然
  • d3.js 受形状约束的力定向布局

    我想知道是否有一种方法可以使用 d3 js 创建强制导向布局并通过任意形状限制它 这样 所有节点均等分布within形状和 边界和节点之间的距离等于节点之间的距离 我希望已经有这样的解决方案 否则 我的想法是从力导向布局开始 并在每次迭代中
  • 在 Sequelize 中按日期范围查询列字段

    我正在尝试使用 Sequelize 查询数据库以获取在特定日期范围内创建的项目 我用的是 between运营商 但我似乎没有得到任何东西 where createdAt between 2018 03 31T21 00 00 000Z 20
  • Gitcherry-pick 会发生合并冲突

    目前我有两个分支 master beta 001 beta 001 之前有时会从 master 处检出 为了使 beta 001 更新到 master 在 master 中推送的提交也将被挑选到 beta 001 一切都运行良好 直到 be
  • 从一个视图切换到下一个视图

    我有一个带有两个视图和视图控制器的应用程序 如何让用户从一个视图切换到下一个视图 例如在主屏幕或天气应用程序中 我知道界面生成器中有一个页面控件 但它只是用户所在页面的指示器 感谢并抱歉我的英语不好 查看 Apple 的 iPhone 示例
  • wxPython 中带有自动关闭计时器的 wxMessageBox

    平台 Windows OS X Python版本 活动状态Python 2 7 wxPython版本 2 9版 如果您通过子类化创建自己的自定义对话框wx Dialog http www wxpython org docs api wx D
  • 在 React js 中将数组作为 props 传递

    我是新来的反应 我一直在尝试 React 但我陷入了如何使用 props 传递数组的困境 case 1 var c program var Navigation React createClass getInitialState funct
  • AES 加密 Java 密钥长度无效

    我正在尝试创建 AES 加密方法 但由于某种原因我不断收到 java security InvalidKeyException Key length not 128 192 256 bits 这是代码 public static Secre
  • Zend_Auth:允许用户登录到多个表/身份

    我在用Zend Auth用于门户网站中的身份验证 一个普通的 mySQL 用户 表 带有login and password列被查询 并且用户登录 但是 我想要对另外两组用户进行身份验证 这三个用户组都有自己的其他表中的登录数据 他们的数据
  • 在 ASP.NET MVC 网站上集成 PayPal 的简单解决方案

    PayPal 为网站提供了许多与 PayPal 支付集成的解决方案 产品 我想知道将 PayPal 集成到 ASP NET MVC Web 应用程序中最简单或最简单的解决方案是什么 我应该使用哪种解决方案 如果以前做过此操作的人可以分享他或
  • 如何在 Rust 中执行高效的向量初始化?

    在 Rust 中填充结构体向量的好方法是什么 大小是动态的 但在初始化时已知 不首先将内存初始化为虚拟值 当内存已满时不会重新分配内存 在此示例中 向量的所有成员都是always已初始化 与 Rust 保持一致 保证没有未定义的行为 理想情
  • C 中指针转换的规则是什么?

    K R 并没有忽略它 但他们使用了它 我尝试通过编写示例程序来了解它是如何工作的 但进展不太顺利 include
  • 更改 LaTeX 字幕语言

    如何更改默认语言 以便在标题之前显示其他内容而不是 表格 或 图 你可以重新定义 figurename and tablename通过使用 renewcommand 例如 您可以对瑞典语执行此操作 renewcommand figurena
  • 创建具有连续数字的列表的列表

    我正在寻找一种方便的方法来创建列表列表 其中列表中的列表具有连续的数字 到目前为止 我只想出了一个非常令人不满意的强力打字解决方案 是的 我现在只使用 python 几个星期 block0 block4 blocks block0 bloc
  • jqPlot - 当有很多图例项目时,饼图图例太高

    我正在使用 jqPlot 创建带有图例的饼图 我的 jqPlot 饼图选项的一部分如下所示 seriesDefaults renderer jqplot PieRenderer rendererOptions padding 10 show
  • 在 iPhone 上使用 twitter:// tweetie:// 自定义方案向特定用户配置文件打开 twitter 应用程序

    我以为我熟悉与 iOS 一起使用的应用程序自定义方案 以从我的应用程序触发应用程序 但我无法使用似乎由官方 twitter 应用程序 又名 tweetie 提供的方案 我正在尝试直接打开 Twitter 应用程序以访问预定义的用户配置文件
  • 在Rx中,处理线程安全是消费者(IObserver)的责任吗?

    在ReactiveX范式中 这是消费者的责任吗 IObserver 来处理线程安全 例如 如果OnCompleted来电时OnNext仍在另一个线程上执行 它看起来像来自 Rx NET 来源 但是the docs https learn m
  • 使用 onclick 按钮成功更改视频源和轨道,但视频仍然相同

    在开始之前 如果我属于转发 我很抱歉 但是 在检查了上一个线程后我仍然没有得到答案 我尝试使用 onclick 按钮更改视频源 但是 尽管来源已更改 但视频仍然相同
  • 在 Swift 中更改属性字符串的文本并保留属性

    对于数据库程序中的输出 我插入了某些文本标记以指示粗体或斜体 以及一些替换图像的文本 例如 Important 所有员工到休息室 的最终输出应为 重要的 所有员工到休息室 我编写了代码来查找周围带有 符号和 符号的文本 但我现在遇到的问题是