Как сопоставить регулярное выражение и вернуть подстроку совпадения - PullRequest
1 голос
/ 07 января 2020

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

Например, я хотел бы получить строковые литералы во входной строке без двойных кавычек

DECLARE
  TYPE STRING_TABLE_TYPE IS TABLE OF VARCHAR2(32000) INDEX BY BINARY_INTEGER;
  string_table_  STRING_TABLE_TYPE;
  input_string_  VARCHAR2(32000);
  regex_pattern_ VARCHAR2(2000);
BEGIN
  regex_pattern_ := '"[^\"]*"';
  input_string_  := '{"ID", type date},
                     {"Reporting Date", type date},
                     {"Reporting Month No", Int64.Type},
                     {"Reporting Quarter", Int64.Type}';

  -- Extract substrings        
  SELECT REGEXP_SUBSTR(input_string_, regex_pattern_, 1, LEVEL, 'inm') text
  BULK COLLECT INTO string_table_
  FROM DUAL
  CONNECT BY REGEXP_SUBSTR(input_string_, regex_pattern_, 1, LEVEL, 'inm') IS NOT NULL;

  -- Printout result
  IF string_table_(1) IS NOT NULL THEN
     FOR i_ IN 1..string_table_.COUNT LOOP
        dbms_output.put_line(string_table_(i_));
     END LOOP;
  ELSE
     dbms_output.put_line('No substrings found!');
  END IF;
END;

Вывод, который я получаю:

"ID"
"Reporting Date"
"Reporting Month No"
"Reporting Quarter"

Я хочу знать , существует ли шаблон регулярного выражения , чтобы я получил это напрямую

ID
Reporting Date
Reporting Month No
Reporting Quarter

Ответы [ 2 ]

4 голосов
/ 07 января 2020

Учитывая ограниченную возможность регулярных выражений Oracle, возможно, проще всего просто TRIM двойные кавычки:

SELECT TRIM(BOTH '"' FROM REGEXP_SUBSTR(input_string_, regex_pattern_, 1, LEVEL, 'inm')) text
BULK COLLECT INTO string_table_
FROM DUAL
CONNECT BY TRIM(BOTH '"' FROM REGEXP_SUBSTR(input_string_, regex_pattern_, 1, LEVEL, 'inm')) IS NOT NULL;

Small демо на dbfiddle

2 голосов
/ 07 января 2020

Кажется, что с 11g вперед есть правильное решение в REGEXP_SUBSTR .

Нам нужно использовать подвыражения в регулярном выражении. aka capture groups.

Например, поскольку нас интересует только часть в двойных кавычках, эту часть необходимо заключить в скобки и сделать подвыражение.

regex_pattern_ := '"([^\"]*)"';

Затем при вызове нам нужно указать, какое подвыражение нам нужно в качестве последнего параметра.

REGEXP_SUBSTR(input_string_, regex_pattern_, 1, LEVEL, 'inm', 1)

Демо

...