oracle 判断非法字符串,Oracle判断字符串合法性

Oracle实际应用中经常碰到字符有效性判断。

校验单个字符是否为字母、数字、符号都比较容易,Oracle提供的函数REGEXP_LIKE使用正则表达式就可以完成。但是汉字就比较特殊,需要特别处理。

1、判断字符是否为数字,V_CHAR为待校验字符(单个)

REGEXP_LIKE(V_CHAR, '(^[0-9]{1}$)')

2、判断字符是否为字母,V_CHAR为待校验字符(单个)

REGEXP_LIKE(V_CHAR, '(^[a-z]{1}$)')

REGEXP_LIKE(V_CHAR, '(^[A-Z]{1}$)')

REGEXP_LIKE(V_CHAR, '(^[a-zA-Z]{1}$)')

3、判断字符是否为特殊符号,V_CHAR为待校验字符(单个)

REGEXP_LIKE(V_CHAR, '(^[()-]{1}$)'),此正则表达式只能为()-,实际应用自行匹配

4、判断字符是否为特殊符号,V_CHAR为待校验字符(单个)

汉字比较特殊,就不能直接比较。

在网上看到有些网友通过比较LENGTH和LENGTHB长度不同来判断(length求得是字符长度,lengthb求得是字节长度),但是没有注意到全角字母A的LENGTH和LENGTHB长度不同但是明显不是字符

查询到汉字的unicode编码范围为4E00到9AF5,可以将字符转换为编码进行判断。

V_CODE := ASCIISTR(V_CHAR); --转换成ASCII字符串

V_CODE := REGEXP_REPLACE(V_CODE, '[^0-9a-zA-Z]'); --去除/,验证是否汉字

IF V_CODE >= '4E00' AND V_CODE <= '9FA5' THEN

OUT_MSG := '为汉字';

END IF;

例子:判断一个字符串中是否只包含汉字,数字,字母,-,(,)

FUNCTION FUNC_CHINESE(P_STR IN VARCHAR2 -- 输入的字符串

) RETURN VARCHAR2 IS

V_NAME VARCHAR2(256);

V_CODE VARCHAR2(256);

V_FLAG VARCHAR2(32);

V_CHAR VARCHAR2(256);

OUT_MSG VARCHAR2(256);

BEGIN

V_FLAG := 'true';

V_NAME := P_STR;

--DBMS_OUTPUT.PUT_LINE(V_NAME);

FOR I IN 1 .. LENGTH(V_NAME) LOOP

V_CHAR := SUBSTR(V_NAME, I, 1); --取字符

--首先判断是否数字,字母,下划线,括号

IF REGEXP_LIKE(V_CHAR, '(^[0-9a-zA-Z()-]{1}$)') THEN

OUT_MSG := '为数字字母()-';

--如果不是数字,字母,下划线,括号

ELSE

V_CODE := ASCIISTR(V_CHAR); --转换成ASCII字符串

V_CODE := REGEXP_REPLACE(V_CODE, '[^0-9a-zA-Z]'); --去除/,验证是否汉字

--DBMS_OUTPUT.PUT_LINE(V_CODE);

IF V_CODE >= '4E00' AND V_CODE <= '9FA5' THEN

OUT_MSG := '为汉字';

ELSE

OUT_MSG := '不为汉字';

V_FLAG := 'false';

END IF;

END IF;

--DBMS_OUTPUT.PUT_LINE(V_CHAR || ' :' || OUT_MSG);

END LOOP;

RETURN V_FLAG;

END;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值