正则表达式

时间:2011-03-25 10:22:47

标签: regex oracle plsql

我有两种方法可以检查11g中特殊字符的字符串

1)使用SELECT

V_CNT_QRY := ' SELECT LENGTH(TRIM(TRANSLATE(:1,
                                             ''
                                             abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '',
                                             '' '')))
                  from dual ';
EXECUTE IMMEDIATE  V_CNT_QRY INTO V_CNT USING V_COLUMN_DATA;

2)使用程序

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;

请建议更好的方法

3 个答案:

答案 0 :(得分:2)

假设您要检查字符串是否仅包含ASCII字符,可以使用:

Select 'No'
  From dual
 Where LENGTH(ASCIISTR(:input_String)) != LENGTH(:input_String)
 Union
Select 'Yes'
  From dual
 Where LENGTH(ASCIISTR(:input_String)) = LENGTH(:input_String)

HTH

答案 1 :(得分:2)

我会以下列方式使用 regexp_replace 函数:

select 'You have'|| decode(regexp_replace (:txt,'^[A-Z0-9a-z]*$', '1'), '1', ' ', ' not ')  || 'entered a string composed only by alphanum characters' from dual;

绑定变量 txt 包含要验证的字符串。

答案 2 :(得分:1)

create table testx
( val1 varchar2(50));

insert into testx (val1) values ('Some ' || chr(9) || 'bad string');
insert into testx (val1) values ('Some nice string with 123 numbers');
commit;

select val1, regexp_instr(val1, '[^[:alnum:] ]') from testx;

如果字符串仅包含字母数字或空格,则select将返回0,否则> 0

所以,你可以添加一个where子句来抓取“坏”字符串:

select val1 from testx where regexp_instr(val1, '[^[:alnum:] ]') > 0;

当然,根据您对“特殊字符”的定义,您可以根据需要对其进行修改。

编辑: 如果您不关心标记标点符号,请尝试:

select val1 from testx where regexp_instr(val1, '[^[:alnum:] [:punct:]]') > 0;

再次根据您的定义修改