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 中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章