Regex Postgresql: рекурсивно удалить последнюю часть строки - PullRequest
0 голосов
/ 22 января 2020

У меня есть строка, которую нужно обрезать, удалив слова из конца строки. Например, если появляются слова ltee., company, co. или какое-либо число, их следует удалить, и оно должно продолжаться, если «новый» конец строки все еще находится в списке.

Предположим, строка PUBLIC SCHOOL 2012 LTEE.. Во-первых, слово LTEE должно быть удалено, чтобы получить PUBLIC SCHOOL 2012, а затем число 2012 должно быть удалено, потому что это число в конце.

Я попытался получить это поведение с помощью следующего:

 select upper(regexp_replace(lower('PUBLIC SCHOOL 2012 LTEE.'),
                            '\d*$|\s(ltee|ltee.|company|co|co.|liability)$',
                            '','g'))

Тем не менее, я просто получаю PUBLIC SCHOOL 2012 с номером в конце.

Есть ли способ удалить номер также? Как насчет того, если есть другое слово, кроме LTEE? * Спасибо

1 Ответ

1 голос
/ 22 января 2020

Вы можете использовать регулярное выражение с заглядыванием, чтобы сопоставить все слова (или строку цифр), которые вы хотите заменить сразу; предвкушение утверждает, что между словом и концом строки находятся только больше тех слов или цепочек цифр:

\s(\d*|ltee\.?|company|co\.?|liability)(?=(?:\s(?:\d*|ltee\.?|company|co\.?|liability))*$)

Пример использования PostgreSQL:

select upper(regexp_replace('PUBLIC SCHOOL 2012 LTEE. CO',
                            '\s(\d*|ltee\.?|company|co\.?|liability)(?=(?:\s(?:\d*|ltee\.?|company|co\.?|liability))*$)',
                            '','gi'))

Вывод:

PUBLIC SCHOOL

Обратите внимание, что вы можете поставить флаг i в regexp_replace, чтобы сделать его без учета регистра, тогда вам не нужно вызывать lower.

Demo на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...