Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выбор построки, ограниченной маркерами / 5 сообщений из 5, страница 1 из 1
06.11.2020, 13:53
    #40015943
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор построки, ограниченной маркерами
Требуется из строки вида "что-то НАЧАЛО что-то КОНЕЦ хвост" выделить подстроку между "НАЧАЛО" и "КОНЕЦ"
Помогите составить шаблон. И посоветуйте ресурс (книгу, сайт), где хорошо объясняются регулярные выражения, и с большим количеством примеров. Пытался разобраться с регуляркой по докам Oracle и Postrgesql, но безрезультатно
...
Рейтинг: 0 / 0
06.11.2020, 14:44
    #40015967
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор построки, ограниченной маркерами
Код: sql
1.
2.
3.
4.
5.
SELECT UNNEST(regexp_matches(  -- i = без учёта регистра
'голова1 НАЧАЛО что-то1 КОНЕЦ хвост1 НАЧАЛО что-то2 КОНЕЦ хвост2', '(?<=\s|^)НАЧАЛО\s+([^\s]+)\s+КОНЕЦ(?=\s|$)', 'ig'));

что-то1
что-то2


Перед вставкой в регулярное выражение фрагментов "НАЧАЛО" и "КОНЕЦ" их нужно экранировать.
...
Рейтинг: 0 / 0
06.11.2020, 15:13
    #40015976
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор построки, ограниченной маркерами
Если "что-то" может содержать пробелы, можно сделать так:
Код: sql
1.
2.
3.
4.
5.
SELECT UNNEST(regexp_matches(
'голова1 НАЧАЛО что-то1 КОНЕЦ хвост1 НАЧАЛО что то2 КОНЕЦ хвост2', '(?<=\s|^)НАЧАЛО\s+(.+?)\s+КОНЕЦ(?=\s|$)', 'ig'));

что-то1
что то2
...
Рейтинг: 0 / 0
06.11.2020, 16:31
    #40016017
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор построки, ограниченной маркерами
Cyrax_02, этот вариант не работает, а пробелы действительно могут быть. Результат
Код: plaintext
"что-то1 КОНЕЦ хвост1 НАЧАЛО что то2"
Cyrax_02, спасибо. Мне этого пока хватит
...
Рейтинг: 0 / 0
08.11.2020, 07:23
    #40016293
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор построки, ограниченной маркерами
Kr_Yury
Cyrax_02
Если "что-то" может содержать пробелы, можно сделать так:
Код: sql
1.
2.
3.
4.
SELECT UNNEST(regexp_matches(
'голова1 НАЧАЛО что-то1 КОНЕЦ хвост1 НАЧАЛО что то2 КОНЕЦ хвост2', '(?<=\s|^)НАЧАЛО\s+(.+?)\s+КОНЕЦ(?=\s|$)', 'ig'));

что-то1 КОНЕЦ хвост1 НАЧАЛО что то2

Cyrax_02, этот вариант не работает, а пробелы действительно могут быть. Результат
Код: plaintext
"что-то1 КОНЕЦ хвост1 НАЧАЛО что то2"
Регулярное выражение корректное . Проверил в PHP/pcre - работает корректно (находит два фрагмента " что-то1 " и " что то2 ").
Почему не работает в PostgreSQL/posix - неизвестно. Либо странный артефакт posix , либо тупой баг реализации в PostgreSQL .
Что происходит : жадный квантификатор + перед нежадным +? делает последний жадным (блокирует действие оператора ? ).

В качестве решения можно заменить конструкцию \s+ конструкцией \s+?(?!\s) , дающую тот же результат, но при этом артефакт не наблюдается:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT UNNEST(regexp_matches(
'голова1 НАЧАЛО   что-то1   КОНЕЦ хвост1 НАЧАЛО   что то2   КОНЕЦ хвост2',
'(?<=\s|^)НАЧАЛО\s+?(?!\s)(.+?)\s+КОНЕЦ(?=\s|$)', 'ig'));  -- i = без учёта регистра

что-то1
что то2

P.S . Судя по молчанию, регулярные выражения в PostgreSQL народ не любит...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выбор построки, ограниченной маркерами / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]