#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 Хорошее наблюдение. Для обнаружения без использования требуется отрицательный прогноз
.
.