Postgres Regex_Replace: использование шаблона при замене строки

#regex #postgresql #regexp-replace

#регулярное выражение #postgresql #регулярное выражение-замена

Вопрос:

Требование Мое требование — проверить, содержит ли имя человека инициалы, заменить его заглавными буквами этой буквы и точки. Для моего требования инициалы всегда будут именами из одной буквы или строками из одной буквы в имени до или после пробела.

Задача Я использую REGEXP_REPLACE и использую y для поиска одного символа в пределах границы слова. Это работает нормально, но теперь мне нужно использовать тот же символ в моей строке замены и сделать его заглавными буквами и добавить точку. По сути, $ 1 в приведенном ниже запросе должен быть заменен строкой, которую я получаю из шаблона y[(A-Z)(a-z)] y

 select REGEXP_REPLACE(first_name,'y[(A-Z)(a-z)]y',upper($1|| '.'),'g' )from public.regextest
  

Пример данных

 Below is table of sample data and code to create sample data

first_name  Suggested value
A           A.
H M         H. M.
Lars E      Lars E.
Jo          Jo
BO          Bo
X X X       X. X. X.
M HAMED     M. HAMED
M P Rajan   M. P. Rajan
Rajan M P   Rajan M. P.
  

Ниже приведен код для создания образца данных.

 create table public.regextest( first_name varchar(100))
insert into  public.regextest values ( 'A')
,('H M')
,('Lars E')
,('Jo')
,('BO')
,('X X X')
,('M HAMED')
,('M P Rajan')
,('Rajan M P')
  

Комментарии:

1. Ни одно из ваших примеров имен не имеет нижнего регистра. Я полагаю Lars e , было бы Lars E. ? И спасибо за образец данных.

Ответ №1:

Выполните замену, затем используйте initcap для заглавной буквы первую букву каждого слова.

 select
  initcap(
    regexp_replace(first_name, 'y([[:alpha:]])y(?!.)', '1.','g')
  )
from public.regextest
  

Класс символов [[:alpha:]] соответствует всем алфавитным символам, включая символы с ударением. Фланкирование его y гарантирует, что мы соответствуем только одному. (?!.) это отрицательный предварительный просмотр, проверяющий, что за ним не следует a . , не используя его . в совпадении, что позволяет избежать удвоения. Он окружен () , чтобы захватить его.

Тогда замена — это захваченный символ, который использует Postgres 1 , с точкой.

Введите результат initcap , чтобы исправить заглавные буквы.

Попробуйте.

Комментарии:

1. Большое спасибо, решение, которое вы предоставили, работает для меня!

2. Одна из проблем, которую я заметил, заключается в том, что в имени уже есть точка . Что-то вроде A. заменяется на .. , как мы можем этого избежать? Очевидно, мы можем написать другой оператор replace и заменить все .. с помощью одного . но это может быть не лучшим способом сделать это.

3. @Vivek Хорошее наблюдение. Для обнаружения без использования требуется отрицательный прогноз . .