在TextView中,用户可以插入文本和图像,例如注释。为了将整个TextView内容保存在数据库(Realm)中,我将图像本身替换为模式“ [image] imageName [/ image]”,因此,当我将数据加载回TextView时,我想替换此模式用于图像。我做了这个功能:
let attributedString = NSMutableAttributedString(string: txtNote.text)
let range = NSRange(location: 0, length: attributedString.string.utf16.count)
let regex = NSRegularExpression("[image](.*?)[/image]")
for match in regex.matches(in: attributedString.string, options: [], range: range) {
if let rangeForImageName = Range(match.range(at: 1), in: attributedString.string){
let imageName = String(attributedString.string[rangeForImageName])
if let image = loadImage(named: imageName) {
let attachment = NSTextAttachment()
attachment.image = image
let oldWidth = attachment.image!.size.width;
let scaleFactor = (oldWidth / (txtNote.frame.size.width - 10))
attachment.image = UIImage(cgImage: attachment.image!.cgImage!, scale: scaleFactor, orientation: .up)
let attString = NSAttributedString(attachment: attachment)
txtNote.textStorage.insert(attString, at: txtNote.selectedRange.location)
} else {
print("Image not found")
}
}
}
我也有此扩展名,以避免尝试捕获上面的函数:
extension NSRegularExpression {
convenience init(_ pattern: String) {
do {
try self.init(pattern: pattern)
} catch {
preconditionFailure("Illegal regular expression: \(pattern).")
}
}
}
我正在运行的示例,attributedString上的内容:
Like Gorillaz :D
[image]4397ACA6-ADDC-4977-8D67-9FF44F10384A.jpeg[/image]
[image]9BE22CA8-9C6C-4FF9-B46F-D8AF33703061.jpeg[/image]

Etc.{
}
应为2个匹配项,图像名称应为:“ 4397ACA6-ADDC-4977-8D67-9FF44F10384A.jpeg”和“ 9BE22CA8-9C6C-4FF9-B46F-D8AF33703061.jpeg”。
但是我的函数返回了14个匹配项,并且图像名称类似:“ k”,“ ll”,“”,“] 4397ACA6-ADDC-4977-8D67-9FF44F10384A.jp”,“ [”等。>
我在做什么错了吗?我整天都在研究诸如此类的错误,但未成功。
答案 0 :(得分:1)
[image]
和[/image]
形成与单个字符匹配的字符类,前一个字符与i
,m
,a
匹配,g
或e
,后者也匹配/
。
如果要将正则表达式的一部分视为文字子字符串,则可以使用\Q...\E
运算符对其进行“引用”:
let regex = NSRegularExpression("\\Q[image]\\E(.*?)\\Q[/image]\\E")
如果确定自己在做什么,请手动"\\[image\\](.*?)\\[/image\\]"
移出括号。
请参阅Regular Expression Metacharacters表:
\Q
引用以下所有字符,直到\E
。
\E
终止一个\Q
...\E
引用的序列。
“报价”是指“在特殊字符之前添加反斜杠以使其与文字字符匹配”。