PostgreSQL regexp_replace用于向字段添加新行或中断标记

时间:2016-06-06 18:03:33

标签: markdown postgresql-9.1

我正在尝试更新数据库表中的字段。该字段包含以下文字:

Course Focus: This course will focus on...

我想在此字段中添加一些Markdown语法,以便"课程焦点" part是一个标题,其余部分显示在它下面,它们之间有一个空行。有很多记录,我想我可以使用regexp_replace一次更新所有记录。我想要:

## Course Focus

This course will focus on...

我试过这个:

update courses 
   set course_focus = regexp_replace(course_focus, 'Course Focus:', '## Course Focus ##\n\r\n\r', 'g');

当在网页中显示时,它都是粗体并且没有换行符:

**Course Focus \n\r\n\r This course will focus on...**  (all bold)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

documentation州:

  

如果您需要在替换文本中添加文字反斜杠,请写\\

在这种情况下,您确实需要一个文字反斜杠。请记住,您的SQL语句将被解释,\n将被视为SQL语句中的换行符,而不是值中的换行符。但是,您希望将换行符作为值的一部分传递给字段,因此您需要额外的反斜杠:\\n。然后,SQL语句解析器将删除一个反斜杠并将\n传递给该字段以进行存储。您可以在this question中找到类似的问题。或者,正如该问题/答案中所指出的,您可以使用E前缀来避免需要双重转义。

顺便说一句,你不需要回车:\r。 Markdown解析器将行结尾标准化为\n,作为其第一步。回车没有价值。当然,如果你真的想要它,你可以把它留在里面,但为了清楚起见,我已将它从我的例子中删除了。

此外,从您的描述中并未完全清楚,但如果“Course Focus:”仅在每个字段中出现一次,则可以删除g标记,这将加快该过程。使用g标志时,正则表达式将需要继续搜索文本字段的其余部分,以便在第一次匹配后可能已停止时进行其他匹配。因此,您可能希望删除g标记。

最终陈述应如下所示:

update courses 
   set course_focus = regexp_replace(course_focus, 'Course Focus:', '## Course Focus ##\\n\\n');

或者像这样,如果你使用E前缀:

update courses 
   set course_focus = regexp_replace(course_focus, 'Course Focus:', E'## Course Focus ##\n\n');