PostgreSQL regexp_replace для добавления новых строк или разрыва тегов в поле

0

Я пытаюсь обновить поле в таблице базы данных. Поле содержит этот текст:

Course Focus: This course will focus on...

Я хочу добавить синтаксис Markdown в это поле, так что часть «Focus Focus» - это заголовок, а остальная часть под ним - пустая строка между ними. Есть много записей, и я думал, что могу использовать 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)

Любые идеи?

    
задан John Cowan 06.06.2016 в 18:03
источник

1 ответ

0

документация гласит:

Write \ if you need to put a literal backslash in the replacement text.

В этом случае вам нужна буквальная обратная косая черта. Помните, что ваш оператор SQL будет интерпретироваться, а \n будет рассматриваться как новая строка в выражении SQL, а не в новой строке в значении. Однако вы хотите передать новую строку в поле как часть значения, поэтому вам потребуется дополнительная обратная косая черта: \n . Затем синтаксический анализатор SQL удалит одну обратную косую черту и передаст \n в поле для хранения. Вы можете найти похожие проблемы в этом вопросе . В качестве альтернативы, как указано в этом вопросе / ответе, вы можете использовать префикс 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');
    
ответ дан Waylan 07.06.2016 в 18:13