Поиск только определенных слов в строке, исключая что-либо между - PullRequest
1 голос
/ 20 сентября 2019

Я ищу шаблон, который может извлечь только искомые слова, заданные в шаблоне, и исключить любые другие слова между ними.

Так что для входной строки ...

2637:1888 log :[INFO] :    create    /* some comment*/    table mytab (n numeric)

... Мне нужно извлечь 'create' и 'table'.

Если что-то еще находится между словом create и таблицей, я должен получить значение null.Я пробовал с различными комбинациями, но я не могу получить много подсказок

Если между словом «создать» и «таблицей» нет комментариев, значит, мой шаблон работает, то есть

(create)\s*(table)

Что мне делать?

1 Ответ

0 голосов
/ 22 сентября 2019

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

where col ~ '\ycreate(?:\s*/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)*\s*table\y'    

См. Демоверсию regex (\y заменено на PCRE \b для демонстрационных целей).

Шаблон соответствует:

  • \y - граница слова
  • create - строка create
  • (?:\s*/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)* - ноль или более вхождений
  • \s* - 0+ пробелов
  • table - строка table
  • \y - граница слова

См. онлайн-демонстрацию :

CREATE TABLE tabl1
    (test character varying)
;

INSERT INTO tabl1
    (test)
VALUES
    ('1: 2637:1888 log :[INFO] :    create  table mytab (n numeric)'),
    ('2: 2637:1888 log :[INFO] :    create    /* some comment*/  table mytab (n numeric)'),
    ('3: 2637:1888 log :[INFO] :    create    /* some comment*/   /**//* some comment2*/    table mytab (n numeric)'),
    ('4: 2637:1888 log :[INFO] :    create    WOW  table mytab (n numeric)')
;

select * from tabl1 where test ~ '\ycreate(?:\s*/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)*\s*table\y';

Выход:

enter image description here

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