我有一个带有文本“ hello world, hello ”的UILabel。有2个问候词。 我想将唯一的“ bold hello ”替换为“感谢”,而不要使用粗体。
我使用以下代码:
uiLabel1.text =“你好,世界,你好”
let target =“ hello”
让replace =“谢谢”
uiLabel1.text.replacingOccurrences(of:target,with:replace,options: NSString.CompareOptions.literal,范围:无)
结果是:“感谢世界,谢谢”
我想要的结果是:“世界你好,谢谢”
答案 0 :(得分:2)
好的,所以可能有一种更简单的方法...
因此,我浏览了API(例如超级快),并寻找了类似lastIndexOf
的东西,这使我步入了String#range(of:options)
的小径,这使您可以向后搜索,嗯,有趣
这将返回Range<String.Index>
...好吧,那我该如何使用呢?嗯,也许是String#replacingOccurrences(of:with:options:range:)
所以,打开一个游戏场地,然后...
var str = "hello world, hello"
let lastIndexOf = str.range(of: "hello", options: .backwards)
str = str.replacingOccurrences(of: "hello", with: "thanks", options: .caseInsensitive, range: lastIndexOf)
str
现在等于"hello world, thanks"
您好,@ MadProgrammer,您的代码要替换最后一个问候词,对吗?但是我的问题是用粗体属性替换hello,它可以在字符串的开头,中间或结尾。
好的,很明显,我们缺少一些上下文信息...
假设现在您正在使用NSAttributedString
,它会变得稍微复杂一些
构建字符串本身并不难,要弄清楚如何通过属性查找字符串组件,会更加困难。
很幸运,我们拥有互联网。因此,以下内容基于我的想法:
尝试解决问题时要记住的重要事情之一,您将很幸运地找到一个可以解决所有问题的答案,相反,您需要分解问题并专注于解决单个要素,并做到准备回到起点
所以,再次来到操场上...
import UIKit
var str = "hello world, "
//let lastIndexOf = str.range(of: "hello", options: .backwards)
//str = str.replacingOccurrences(of: "hello", with: "thanks", options: .caseInsensitive, range: lastIndexOf)
extension UIFont {
var isBold: Bool {
return fontDescriptor.symbolicTraits.contains(.traitBold)
}
var isItalic: Bool {
return fontDescriptor.symbolicTraits.contains(.traitItalic)
}
}
// Just so I can see that the style ;)
let fontSize = CGFloat(24.0)
let boldAttrs = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: fontSize),
NSAttributedString.Key.foregroundColor: UIColor.white // Playground
]
// Playground only
let plainAttrs = [
NSAttributedString.Key.foregroundColor: UIColor.white // Playground
]
let boldText = NSMutableAttributedString(string: "hello", attributes: boldAttrs)
let styledText = NSMutableAttributedString(string: str, attributes: plainAttrs)
let someMoreBoldText = NSMutableAttributedString(string: "not to be replaced", attributes: boldAttrs)
// Attributes can be combined with their appear together ;)
styledText.append(boldText)
styledText.append(NSMutableAttributedString(string: " ", attributes: plainAttrs))
styledText.append(someMoreBoldText)
styledText.append(NSMutableAttributedString(string: " ", attributes: plainAttrs))
styledText.append(boldText)
styledText.enumerateAttribute(NSAttributedString.Key.font, in: NSRange(0..<styledText.length)) { (value, range, stop) in
guard let font = value as? UIFont, font.isBold else {
return;
}
let subText = styledText.attributedSubstring(from: range)
guard subText.string == "hello" else {
return
}
styledText.replaceCharacters(in: range, with: "thanks")
}
styledText
哪个输出...
对我来说重要的是:
答案 1 :(得分:0)
这是代码。但是实际上这是硬编码的。如果target
放在<b></b>
之间,它将起作用。
var text = "hello world, <b>hello</b>"
let target = "hello"
let replace = "thanks"
text = text.replacingOccurrences(of: "<b>\(target)</b>", with: replace, options: .literal, range: nil) //hello world, thanks