Функции на regexp_replace приводят к Postgres
У меня есть база данных адресов, где аббревиатуры были разделены пробелом, я хочу удалить эти пробелы, поэтому я обратился к надежным регулярным выражениям. Тем не менее, я изо всех сил пытаюсь выполнить дополнительную функцию для результата регулярного выражения '\&' - я проверил форумы и документы и просто не могу заставить это работать. Пример данных у меня выглядит следующим образом:
- "A V C Welding" должен быть "A V C Welding"
- "H S B C" должен быть "H S B C"
- так далее..
У меня есть следующее регулярное выражение:
trim(regexp_replace(organisation || ' ', '(([A-Z]\s){1}){2,}', replace('\&',' ',''), 'g'))
replace('\&',' ','')
не имеет никакого эффекта вообще, я просто получаю ту же строку обратно. Я пробовал другие функции, например lower('\&')
и ни один из них, кажется, не работает как ожидалось. Конкатенация с || работает, однако. Я пытался привести '\ &' к тексту, пытался replace('' || '\&' || '',' ','')
- все равно нет радости.
Любой совет будет высоко ценится, я уверен, что решение очень простое, но я просто не вижу, куда идти дальше!
1 ответ
Что вы пытаетесь сделать с \&
никогда не сработает. \&
шаблон заменит весь шаблон, но вам нужно решение, которое работает на отдельных частях.
Что вам нужно, это заменить шаблон CAPITAL-space
просто CAPITAL
но только когда за ним следует другая заглавная буква, которая не является началом более длинного слова. Другими словами: вам нужен отрицательный взгляд, и если шаблон соответствует, то замените только первый атом строки замены:
select regexp_replace('A V C Welding', '([A-Z]){1}(\s){1}(?![A-Z][a-z])', '\1', 'g');
При необходимости вы можете заменить шаблон с отрицательным прогнозом на что-то более широкое (например, без начальных букв, цифр, знаков пунктуации и т. Д.).