我想通过正则表达式进行匹配,但要获取它的子字符串。
例如,我想在输入字符串中获取字符串文字而无需使用双引号
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
答案 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;
答案 1 :(得分:2)
从11g开始,REGEXP_SUBSTR中似乎有适当的解决方案。
我们需要在正则表达式中使用子表达式。又名捕获小组。
例如,由于我们只对双引号内的部分感兴趣,因此该部分需要用括号括起来并做一个子表达式。
regex_pattern_ := '"([^\"]*)"';
然后在调用时,我们需要指定我们需要哪个子表达式作为最后一个参数。
REGEXP_SUBSTR(input_string_, regex_pattern_, 1, LEVEL, 'inm', 1)