regex.matches方法匹配和计数错误

时间:2019-03-26 21:19:40

标签: swift regex swift4

在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”,“ [”等。

我在做什么错了吗?我整天都在研究诸如此类的错误,但未成功。

1 个答案:

答案 0 :(得分:1)

[image][/image]形成与单个字符匹配的字符类,前一个字符与ima匹配,ge,后者也匹配/

如果要将正则表达式的一部分视为文字子字符串,则可以使用\Q...\E运算符对其进行“引用”:

let regex = NSRegularExpression("\\Q[image]\\E(.*?)\\Q[/image]\\E")

如果确定自己在做什么,请手动"\\[image\\](.*?)\\[/image\\]"移出括号。

请参阅Regular Expression Metacharacters表:

  

\Q引用以下所有字符,直到\E
  \E终止一个\Q ... \E引用的序列。

“报价”是指“在特殊字符之前添加反斜杠以使其与文字字符匹配”。