如何匹配正则表达式并返回匹配的子字符串

时间:2020-01-07 04:22:59

标签: regex oracle plsql

我想通过正则表达式进行匹配,但要获取它的子字符串。

例如,我想在输入字符串中获取字符串文字而无需使用双引号

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 个答案:

答案 0 :(得分:4)

鉴于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;

demo on dbfiddle

答案 1 :(得分:2)

从11g开始,REGEXP_SUBSTR中似乎有适当的解决方案。

我们需要在正则表达式中使用子表达式。又名捕获小组。

例如,由于我们只对双引号内的部分感兴趣,因此该部分需要用括号括起来并做一个子表达式。

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

然后在调用时,我们需要指定我们需要哪个子表达式作为最后一个参数。

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

Demo