#regex #postgresql #regex-lookarounds
#регулярное выражение #postgresql #поиск регулярных выражений
Вопрос:
Я бы хотел сохранить вместе инициалы (максимум две буквы), когда между ними есть знаки препинания или пробелы.
У меня есть следующий фрагмент для решения практически всего, но у меня возникают проблемы с сохранением инициалов, разделенных пунктуацией и пробелом. Например, это работает с обычным регулярным выражением, но не в postgresql:
SELECT regexp_replace('R Z ELEMENTARY SCHOOL',
'(b[A-Za-z]{1,2}b)s W*(?=[a-zA-Z]{1,2}b)',
'1')
Результатом должна быть «НАЧАЛЬНАЯ ШКОЛА RZ». Другие примеры будут включать:
A amp; D ALTERNATIVE EDUCATION
J. amp; H. KNOWLEDGE DEVELOPMENT
A. - Z. EVOLUTION IN EDUCATION
Преобразование должно быть следующим:
AD ALTERNATIVE EDUCATION
JH KNOWLEDGE DEVELOPMENT
AZ EVOLUTION IN EDUCATION
Как добиться этого в Postgresql?
Спасибо
Комментарии:
1. Ну, на самом деле это не работает даже в «обычном» регулярном выражении. Всегда ли есть только два инициала? Всегда ли они находятся в начале строки?
2. Или,
JH. KNOWLEDGE DEVELOPMENT
иAZ. EVOLUTION IN EDUCATION
вывод в порядке?3. Спасибо @Wiktor Было бы без точки в конце инициалов
4. Их будет ровно два или может быть больше? Фиксировано ли количество инициалов на некоторую сумму?
5. Фиксированного количества букв не существует. Инициалы могут быть такими, как «УЧРЕЖДЕНИЕ Y-M-C-A» или «ПРИМЕР N.A.S.D. amp; AQ», должны быть преобразованы в УЧРЕЖДЕНИЕ YMCA и ПРИМЕР NASDAQ
Ответ №1:
Основываясь на вашем текущем регулярном выражении, я могу порекомендовать
SELECT REGEXP_REPLACE(
REGEXP_REPLACE('J. amp; H. KNOWLEDGE DEVELOPMENT', 'm([[:alpha:]]{1,2})Ms*W*(?=[[:alpha:]]{1,2}M)', '1'),
'^([[:alpha:]] )W ',
'1 '
)
Посмотрите онлайн-демонстрацию, дающую
regexp_replace
1 JH KNOWLEDGE DEVELOPMENT
Это двухэтапное решение. Первое регулярное выражение соответствует
m([[:alpha:]]{1,2})M
— целые одно- или двухбуквенные слова, записанные в группу 1 (m
является границей начального слова иM
границей конечного слова)s*
— ноль или более пробеловW*
— ноль или более символов, не содержащих слов(?=[[:alpha:]]{1,2}M)
— позитивный прогноз, который требует целого слова из одной или двух букв сразу справа от текущей позиции.
Совпадение заменяется содержимым группы 1 ( 1
).
Второе регулярное выражение соответствует буквенному слову в начале строки и заменяет все символы, не являющиеся словами, после него пробелом.
Комментарии:
1. Спасибо @Wiktor Stribizew, решение отлично работает, за исключением некоторых случаев. Как я мог бы получить сокращения в
--H.G.E. PUBLIC EDUCATION --A S G FULL TIME
2. @JuanPerez Я не понимаю, является ли приведенная выше строка одной записью или двумя отдельными ( regex101.com/r/Jw8lpF/1 ).
3. Извините, это две разные записи.