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

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

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
1
Gayan Dasanayake 7 Янв 2020 в 07:22

2 ответа

Лучший ответ

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

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

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

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

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

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

Демо

2
Gayan Dasanayake 7 Янв 2020 в 08:18

Учитывая ограниченную возможность регулярных выражений 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;

Небольшая демонстрация на dbfiddle

4
Nick 7 Янв 2020 в 04:35