regex - 如何匹配正则表达式并返回匹配的子字符串
问题描述
我想通过正则表达式匹配,但得到它的子字符串。
例如,我想在输入字符串中获取不带双引号的字符串文字
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
解决方案
TRIM
鉴于 Oracle 的正则表达式功能有限,仅使用双引号可能最简单:
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 上的小演示