В нашей серьезной организации все отделы должны иметь аббревиатурные названия, непонятные стороннему человеку (сиречь потенциальному шпиёну). Должны, но не обязаны. Поэтому у нескольких отделов таких аббревиатур нет. При переносе справочника на другой сервер пришлось озадачиться автоматической генерацией аббревиатур из названий отделов. Разумеется, помогли регулярные выражения. Приведенный ниже пример формирует аббревиатуры из названий отделов, выбрасывая союз " и " и тире из названий, как ненужные.
select
-- переводим строку в верхний регистр
upper(
-- удаляем пробелы, схлопывая оставшиеся буквы в аббревиатуру
regexp_replace(
-- удаляем сформированные последовательности из исходной строки
regexp_replace(
rs_name,
-- формируем шаблон типа (<динамическая последовательность1> | < динамическая последовательность2>[|...] | < фиксированная последовательность1>[|...])
'('||
-- убираем размноженные перечислители, заменяя их на одиночные
regexp_replace(
-- убираем лишний перечислитель из начала предложения
regexp_replace(
-- убираем начальные буквы из каждого слова в предложении, заменяя их на перечислители "|"
regexp_replace(
rs_name,
'( ^|\s)\w',
'| '
),
'^[|]+ ',
null
),
'[|][|]+',
'|'
)||
-- добавляем блок фиксированных последовательностей " и "
'|\s+и\s+|\s*-]s*)',
null
),
'\s',
null
)
)
from
(
select regexp_replace(rs_name, '(Радио|радио)(навигационн|локационн| астрономическ|вещательн)', '\1 \2') rs_name, rs_abbr from DIC_RADIOSERVICE t
) t
Приведенный алгоритм также учитывает некоторые общепринятые сокращения отдельных слов, таких как: радионавигационная - РН, а не Р, радиолокационная - РЛ, а не Р, радиоастрономическая - РА, но не Р, радиовещательная - РВ, но не Р. Для этого в исходное название между "Радио" и остатком названия службы вставляется пробел, чтобы в результате получилось бы правильное сокращение.
Комментариев нет:
Отправить комментарий