Метод regex.matches совпадает и считает неправильно - PullRequest
1 голос
/ 27 марта 2019

В 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).")
        }
    }
}

Пример, который я запускаю, содержимое на attribuStString:

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 Ответ

1 голос
/ 27 марта 2019

[image] и [/image] формы классов символов , которые соответствуют одиночным символам, первые соответствуют i, m, a, g или e, а последние также соответствует /.

Если вы хотите трактовать часть регулярного выражения как буквальную подстроку, вы можете "заключить" ее в кавычки с помощью \Q...\E операторов:

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

Если вы уверены, что делаете, уберите скобки вручную, "\\[image\\](.*?)\\[/image\\]".

См. Метасимволы регулярных выражений Таблица:

\Q Цитирует все последующие символы до \E.
\E Завершает последовательность в кавычках \Q ... \E.

«Кавычки» означает «добавляет обратную косую черту перед специальными символами, чтобы они соответствовали буквальным символам» здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...