Ограничьте вывод регулярного выражения первым появлением специального символа в postgres (regexp_match) - PullRequest
0 голосов
/ 03 февраля 2020

Я применяю следующее регулярное выражение для столбца со значением

uniprotkb:P89903(protein(MI:0326), 349975 - Simian immunodeficiency virus - agm.tan-1)
^[^:]*:\s*[^()]+\(.*\(.*\),.*\-(.*)

, чтобы извлечь текст после первого '-'. Желаемое значение:

Simian immunodeficiency virus - agm.tan-1

Однако мое регулярное выражение соответствует последнему вхождению '-'. Как я могу получить ограничение вывода до первого появления '-'

Спасибо

1 Ответ

1 голос
/ 03 февраля 2020

Вы можете использовать

select REGEXP_MATCHES('uniprotkb:P89903(protein(MI:0326), 349975 - Simian immunodeficiency virus - agm.tan-1)', '^[^:]*:\s*[^()]+\([^()]*\([^()]*\),[^-]*-\s*([^)]*)')

См. онлайн PostgreSQL демо . Вывод:

enter image description here

ПРИМЕЧАНИЯ

  • Все .* заменены на отрицательные классы символов для Немного измените шаблон так, чтобы . не мог соответствовать круглым скобкам
  • Last .* превращается в [^)]* для соответствия вплоть до ), исключая его.

Более слабый шаблон, который вы можете использовать здесь, это найти space + - + space и сопоставить все символы, отличные от ) оттуда (то есть ' - (.*)\)' шаблон):

select REGEXP_MATCHES('uniprotkb:P89903(protein(MI:0326), 349975 - Simian immunodeficiency virus - agm.tan-1)', ' - (.*)\)')

См. это онлайн демо

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