Обрабатывать инициалы в Postgresql

#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. Извините, это две разные записи.