【问题标题】:plsql oracle prevent the use of special characters in the 2nd char of stringplsql oracle 防止在字符串的第二个字符中使用特殊字符
【发布时间】:2016-01-13 10:54:58
【问题描述】:
create or replace function MyFunction(v_FileName in varchar2)

我想防止在 v_FileName 的第二个字符中使用特殊字符。

这些字符是:

!@#$%^&*()_+=`~[]{}'\|?/>

(我想允许使用 . 和 ")

我尝试了几个 regexp_like 表达式,但没有运气。 示例:

DECLARE
  vResult NUMBER DEFAULT NULL;
BEGIN    
  select case when regexp_like('d[av inder 1234' ,'^[[:alnum:]]([^[:alnum:]]|\"+|\.+)') then 0 else 1 end into vintResult from dual;
  dbms_output.put_line('result: '||vintResult);
END;

输出:

result: 1

result 应该是 0,因为 char [ 应该是不允许的。

我做错了什么?

【问题讨论】:

    标签: oracle plsql regexp-like


    【解决方案1】:

    您缺少第一个字符类 [[alnum]] 周围的冒号:

    '^[[:alnum:]]([^[:alnum:]]|\"+|\.+)'
    

    例如

    select case when regexp_like('d[av inder 1234',
      '^[[:alnum:]]([^[:alnum:]]|\"+|\.+)')
        then 0 else 1 end as vintResult from dual;
    
    VINTRESULT
    ----------
             0
    

    或者:

    DECLARE
      vintResult NUMBER DEFAULT NULL;
    BEGIN    
      select case when regexp_like('d[av inder 1234' ,'^[[:alnum:]]([^[:alnum:]]|\"+|\.+)') then 0 else 1 end into vintResult from dual;
      dbms_output.put_line('result: '||vintResult);
    END;
    /
    
    PL/SQL procedure successfully completed.
    
    result: 0
    

    如果您允许任何字符出现在第一个位置,您可以只使用一个点:

    '^.([^[:alnum:]]|\"+|\.+)'
    

    ...但我怀疑您确实只希望在第一个位置使用字母数字。如果您有要排除的特定字符列表,那么可能会更清楚,特别是对于将来维护它的人来说,列出这些而不是使用第二个字符类 - 如@KevinEsche 的回答。 (我不确定你的模式是否完全符合你说你想要禁止的模式)。

    DECLARE
      vintResult NUMBER DEFAULT NULL;
    BEGIN    
      select case when regexp_like('d[av inder 1234' ,'^.[][!@#$%^&*()_+=`~{}''\|?/><,;:].*')
        then 0 else 1 end into vintResult from dual;
      dbms_output.put_line('result: '||vintResult);
    END;
    /
    
    PL/SQL procedure successfully completed.
    
    result: 0
    

    注意字符组中方括号的位置,这些字符已从原始字符串中移出;这是为了防止他们被误解为提前结束小组。

    【讨论】:

    • 编辑了列。我的代码中确实有它们,但忘记在这里写了。但仍然无法正常工作。我如何使用要禁止的字符列表?我应该使用什么模式?
    • @DrorCohen - 您的代码在列中按预期运行(无论如何,变量名称声明已固定)。所以不知道你在做什么不同。
    • 我在将字符从[ 到 " 我仍然得到结果:0 但它应该是 1 因为 " 是允许的
    • @DrorCohen - 好吧,我已经展示了使用该模式和 Kevin 的代码和示例值。也许您正在检查的字符串没有违反规则。
    • :( 'd[av inder 1234' 肯定不应该工作。但 'd"av inder 1234' 或 'd.av inder 1234' 确实需要工作
    【解决方案2】:

    你也可以像这样简单地使用它。

    使用[] 定义一组应该匹配的字符

    select case when regexp_like('d''v inder 1234' ,'^.[][!@#$%^&*()_+=`~{}''\|?/><,;:].*') then 0 else 1 end from dual;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2023-04-04
      • 2021-08-16
      • 2020-04-28
      相关资源
      最近更新 更多