【问题标题】:How to match regular expression and return a substring of the match如何匹配正则表达式并返回匹配的子字符串
【发布时间】:2020-04-24 14:08:57
【问题描述】:

我想通过正则表达式匹配但得到它的子字符串。

例如,我想在输入字符串中获取不带双引号的字符串文字

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

【问题讨论】:

  • 您应该在这里使用 Oracle 的 JSON 函数,而不是正则表达式。
  • @TimBiegeleisen 这不是真正的 JSON...
  • 这个例子是虚构的,这里只关注正则表达式。
  • 我可以在正则表达式中使用某种前瞻或回溯功能吗?

标签: regex oracle plsql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    Demo

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      相关资源
      最近更新 更多