Привет! Я пытаюсь выполнить несколько команд regexp_replace в консоли PostgreSQL, чтобы преобразовать ссылки в моем тестовом экземпляре Discourse, который был перенесен с огромного форума Drupal 7. Почти в 2 миллионах сообщений есть ссылки в формате Textile, которые нужно конвертировать в Markdown. Вот что я пытаюсь использовать:
Это работает корректно как в указанном тестере, так и в моем текстовом редакторе; оно превращает:
Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) "link":http://www.youtube.com/watch?v=aQjkOmzQ8RT
В это:
Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http://www.youtube.com/watch?v=aQjkOmzQ8RT)
Но в консоли PostgreSQL Discourse я запускаю это:
update posts set raw = regexp_replace(raw, '"(.*?)"\:(http\S+?(?=\W+(?:$|\s))|http\S+)', E'[\\1](\\2)', 'g');
И в итоге получаю:
Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT
(Извините за анонимизацию.) Таким образом, ключевой момент здесь:
- Правильно:
[link](http://www.youtube.com/watch?v=aQjkOmzQ8RT) - Неправильно:
[link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT
Думаю, это связано с особенностями экранирования символов в SQL-запросах и/или со специальными функциями [] и () по сравнению с буквальными значениями, но я не могу разобраться. Есть какие-то идеи? Спасибо!