Oracle的REGEXP_INSTR再mysql中实现

ORACLE中的支持正则表达式的函数主要有下面四个:
1,REGEXP_LIKE :与LIKE的功能相似
2,REGEXP_INSTR :与INSTR的功能相似
3,REGEXP_SUBSTR :与SUBSTR的功能相似
4,REGEXP_REPLACE :与REPLACE的功能相似
它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同。

REGEXP_INSTR (source_string, pattern [, position [, occurrence [, return_option [, match_parameter ] ] ] ] )
参数说明:
参数说明:
source_string:输入的字符串
pattern:正则表达式
position:标识从第几个字符开始正则表达式匹配。(默认为1)
occurrence:标识第几个匹配组。(默认为1)
return_option:0——返回第一个字符出现的位置。1:pattern下一个字符起始位置。
match_parameter:取值范围
i:大小写不敏感;
c:大小写敏感;
n:点号 . 不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。

CREATE FUNCTION regexp_instr(source VARCHAR(4000), pattern VARCHAR(4000), pos INT, occurrence INT, return_option INT, match_type char(1)) RETURNS varchar(4000)
    DETERMINISTIC
BEGIN 
  DECLARE subStr, usePattern VARCHAR(4000); 
  DECLARE startPos, prevStartPos, startInc, len, lenInc INT;
  DECLARE result, src_len, f_count INT default 0;
  declare mat_res boolean default false;
  
  if match_type = 'i' then   -- 不区分大小写
    IF source REGEXP pattern then
      set mat_res = true;
    end if;
  else  -- 区分大小写 (其它模式未实现)
    IF source REGEXP BINARY pattern then
      set mat_res = true;
    end if;
  end if;
 
  IF mat_res then
  	set mat_res = false;
  	set pos = if(pos < 1, 1, pos);
    set occurrence = if(occurrence < 1, 1, occurrence);
    set source = substring(source, pos);
    SET src_len = CHAR_LENGTH(source);

    SET usePattern = IF (LEFT(pattern, 1) = '^', pattern, CONCAT('^', pattern));
    SET usePattern = IF (RIGHT(pattern, 1) = '$', usePattern, CONCAT(usePattern, '$'));

    SET startPos =  1, startInc = 1;
   
    WHILE startPos >= 1 AND startPos <= src_len
      AND startPos + 1 - 1 <= src_len
      AND !(LEFT(pattern, 1) = '^' AND startPos <> 1)
      AND !(RIGHT(pattern, 1) = '$'
            AND startPos - 1 < 0) DO
      SET len = LEAST(src_len - startPos + 1, src_len), lenInc = -1;
      SET prevStartPos = startPos;
      lenLoop: WHILE len >= 1 AND len <= src_len
                 AND startPos + len - 1 <= src_len
                 AND !(RIGHT(pattern, 1) = '$' 
                       AND startPos + len - 1 <> src_len) DO
        SET subStr = SUBSTRING(source, startPos, len);
        
        if match_type = 'i' then
		  IF subStr REGEXP usePattern then
		      set mat_res = true;
		    end if;
		  else
		    IF subStr REGEXP BINARY usePattern then
		      set mat_res = true;
		    end if;
		  end if;

		IF mat_res then
		  set mat_res = false;
		  SET f_count = f_count + 1;
          SET startPos = startPos + startInc * len;
          LEAVE lenLoop;
        END IF;
        SET len = len + lenInc;
      END WHILE;
     
      IF (occurrence = f_count) then
		if (return_option != 0) then
		  return startPos + pos -1;
		end if;
		return prevStartPos + pos - 1;
      END IF;
	  
      IF (startPos = prevStartPos) THEN
        SET startPos = startPos + startInc;
      END IF;
    END WHILE;
  ELSE
    SET result = 0;
  END IF;
  
  RETURN result;
END
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值