Postgres控制台边缘情况不遵守POSIX正则表达式规则?

您好,我正在尝试在 pg 控制台中运行一些 regexp_replace 命令,以转换我的测试 Discourse 实例中的链接,该实例是从一个巨大的 Drupal 7 论坛迁移过来的。在近 200 万篇文章中,有许多 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)

但是,在 Discourse 的 pg 控制台中,我运行了这个:

  • 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 查询中的转义字符怪异性以及/或 []() 的特殊函数与字面量的关系有关,但我无法弄清楚。有什么想法吗?谢谢!

我不知道 PostgreSQL,但它在 rails 控制台中运行正常:

Post.find_each do |p|
  p.raw.gsub!(/\"(.*?)\"\\:(http\\S+?(?=\\W+(?:$|\\s))|http\\S+)/, '[\\\\1](\\\\2)')
  p.save
end
2 个赞

啊,非常感谢您向我展示如何使用 Rails 控制台来完成此操作。它运行起来似乎比执行原始 SQL 命令慢很多(这很合理),因此如果命令完成,我会及时汇报。

好吧,我最终中止了 Rails 进程,然后回到了 pg 控制台。我还收到了一个关于更简单(也希望更容易调试)的正则表达式的建议,它在 pg 控制台之外也工作得很好:
\"(.*?)\":(\\S*)\\b

但 SQL 查询肯定有些非标准之处,这对链接没有任何作用:
update posts set raw = regexp_replace(raw, '\"(.*?)\":(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');
这个也没有:
update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');

所以这是怎么回事?