PL/SQL 中的正则表达式

Posted

技术标签:

【中文标题】PL/SQL 中的正则表达式【英文标题】:Regular expression in PL/SQL 【发布时间】:2009-03-20 15:08:18 【问题描述】:

我正在使用正则表达式来查找用户输入的值是否是字母数字,允许一些特殊字符。

我正在使用以下代码,效果很好:

CREATE OR REPLACE PROCEDURE Validate_Inputstring (input_String IN VARCHAR2) AS
BEGIN

  IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z,+-?@]*$') THEN 
      DBMS_OUTPUT.PUT_LINE('U have entered alphanumeric chars--->'|| input_String);
    ELSE
      DBMS_OUTPUT.PUT_LINE('U NOT have entered alphanumeric chars---->'|| input_String);
  END IF;
END;

上述程序运行良好。 现在我的问题是这些特殊符号是动态的,并且这些值因应用程序而异。

换句话说,它们存储在数据库中,并且对于每个应用程序都不同。

例如,对于应用程序 A,这些可能是 , + - ? @,对于 B,这些可能是 ^ & '

是否可以编写一个正则表达式,使其一次检查字母数字字符和这些动态特殊符号?

我尝试过类似的东西

CREATE OR REPLACE PROCEDURE Validate_Inputstring (input_String IN VARCHAR2) AS
    special_symbols     VARCHAR2(300);

BEGIN
    special_symbols :=',+-?';
    IF  REGEXP_LIKE(input_String,'^[A-Z0-9a-zspecial_symbols]*$') THEN 
        DBMS_OUTPUT.PUT_LINE('U have entered alphanumeric chars--->'|| input_String);
      ELSE
        DBMS_OUTPUT.PUT_LINE('U NOT have entered alphanumeric chars---->'||    input_String);
    END IF;
END;

但它不起作用。有人对此有解决方案吗?提前致谢!

【问题讨论】:

这是一个需要Lolcode输出的好玩的项目吗? 【参考方案1】:

bobince 在正确的轨道上,但语法不太正确 - Oracle 中的连接运算符是 ||,并且在 replace() 调用中缺少表达式...

REGEXP_LIKE(input_String,'^[A-Z0-9a-zspecial_symbols]*$')

你必须跳出字符串来插入你的符号:

REGEXP_LIKE(input_String,'^[A-Z0-9a-z' || special_symbols || ']*$')

但是有一点问题是您的特殊符号对于正则表达式也可能是特殊的。 []-character-class 中的“-”表示执行范围而不是字面匹配“-”; ']' 会过早地结束字符类。您必须使用字符串替换对这些字符以及反斜杠本身进行反斜杠转义。

special_symbols:= ',+-?';
special_group:= replace(replace(replace(special_symbols, '\', '\\'), '-', '\-'), ']', '\]');
IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z' || special_group || ']*$') ...

【讨论】:

【参考方案2】:

REGEXP_LIKE(input_String,'^[A-Z0-9a-zspecial_symbols]*$')

你必须跳出字符串来插入你的符号:

REGEXP_LIKE(input_String,'^[A-Z0-9a-z'+special_symbols+']*$')

但是有一点问题是您的特殊符号对于正则表达式也可能是特殊的。 []-character-class 中的“-”表示执行范围而不是字面匹配“-”; ']' 会过早地结束字符类。您必须使用字符串替换对这些字符以及反斜杠本身进行反斜杠转义。

special_symbols:= ',+-?';
special_group:= replace(replace(replace('\', '\\'), '-', '\-'), ']', '\]');
IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z'+special_group+']*$') ...

【讨论】:

【参考方案3】:

感谢您的回复

我的代码如下 FUNCTION Validate_Inputstring_Func(input_String IN VARCHAR2) RETURN BOOLEAN IS

special_symbols VARCHAR2(300); 开始

special_symbols :='+?@'; DBMS_OUTPUT.PUT_LINE('Enetered value is NULL'); 别的 DBMS_OUTPUT.PUT_LINE('Enetered value is Not NULL'|| input_String);

IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z'+special_symbols+']*$') THEN DBMS_OUTPUT.PUT_LINE('U已输入字母数字字符--->'|| input_String); 返回错误;

否则 DBMS_OUTPUT.PUT_LINE('你没有输入字母数字字符---->'|| input_String); 返回真; 万一; 如果结束;

结束;

【讨论】:

第一次调用 DBMS_OUTPUT 之前似乎缺少 IF..THEN。此外,连接运算符是 ||不是+。

以上是关于PL/SQL 中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL Oracle 正则表达式对于零的出现不起作用

PL/SQL 正则表达式检查

正则表达式背后的 pl/sql 否定查看

如何使用正则表达式或任何其他方法在 PL/SQL 中提取单引号内的字符串 [重复]

pl/sql 正则表达式验证

在 oracle 中使用正则表达式查找 POBOX - PL/SQL