【问题标题】:PL/SQL regexp_like filtersPL/SQL regexp_like 过滤器
【发布时间】:2017-05-24 06:26:39
【问题描述】:

我想删除一些表并写了这个程序:

    set serveroutput on
    declare
        type namearray is table of varchar2(50);
        total integer;
        name namearray;
    begin
        --select statement here ..., please see below
        total :=name.count;
        dbms_output_line(total);

        for i in 1 .. total loop
        dbms_output.put_line(name(i));
        -- execute immediate 'drop table ' || name(i) || ' purge';
    End loop;
    end;
    /

这个想法是删除所有表名具有如下模式的表:

ERROR_REPORT[2 digit][3 Capital characters][10 digits]
example: ERROR_REPORT16MAY2014122748

但是,我无法提出正确的正则表达式。以下是我的选择语句和结果:

select table_name bulk collect into name from user_tables where regexp_like(table_name, '^ERROR_REPORT[0-9{2}A-Z{3}0-9{10}]');

结果包括我需要的所有表名以及 ERROR_REPORT311AUG20111111111。这不应该出现在结果中。

follow select 语句显示相同的结果,这意味着 A-Z{3} 对正则表达式没有影响。

select table_name bulk collect into name from user_tables where regexp_like(table_name, '^ERROR_REPORT[0-9{2}0-9{10}]');

我的问题是正确的正则表达式是什么,我的问题是什么?

谢谢,

亚历克斯

【问题讨论】:

    标签: regex oracle plsql oracle12c


    【解决方案1】:

    我认为这个正则表达式应该可以工作:

    ^ERROR_REPORT[0-9]{2}[A-Z]{3}[0-9]{10}
    

    但是,请查看regex101 链接。我假设您在 ERROR_REPORT 之后需要 2 位数字,但您的示例名称显示为 3。

    【讨论】:

    • 谢谢!我知道了。 \d 呢? \d 是否与 [0-9] 相同?
    • 请忽略\d上的问题。
    【解决方案2】:

    正确的正则表达式是

    '^ERROR_REPORT[0-9]{2}[A-Z]{3}[0-9]{10}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      相关资源
      最近更新 更多