赞
踩
需求一:获取字符串中特定字符逗号","在字符串",abc,,,d,,ef,"中出现的次数(共出现7次)。
需求二: 获取字符串中特定字符串“@-”在字符串“@-ab@@cd--ef@h-j”中出现的次数(工出现1次)
--------------------需求一---------------
方式一, regexp_count函数:
- 语法: regexp_count(source_str, target_char [, position [, match_param]])
- source_str:包含特定字符的字符串
- target_char:特定字符
- position: 从哪个下标开始搜索,可省略,但需>=1
- match_param: 正则的匹配模式参数, 'i':忽略大小写; ‘c’或不配置该参数:不忽略大小写;此外还有‘n’、‘m’、‘x’等参数。
使用oracle11g提供的regexp_count函数,直接获取特定字符在字符串中出现的次数。
select regexp_count(',abc,,,Ad,,ef,', ',') from dual;
结果如下图:
方式二, translate函数:
- 语法:translate(source_str, from_str, to_str)
- source_str:待处理的字符串
- from_str:需要转义的字符拼接而成的串
- to_str:转义后的字符拼接而成的串
- 解释:
- 0. 三个字符串中任意一个为null,其结果都是null
- 1. from_str和to_str的对应关系,从左往右用一一对应, 对于在from_str中出现的重复字符,
- 且重复字符的下标在to_str该下标有值时,会同时忽略重复字符在from_str和to_str下标的值。
- 既重复字符以第一次出现的替换规则为准。
- 2. from_str的长度大于to_str的长度时,对于from_str中多出来的字符可以理解为将其转换为空字符串。
- 多于字符串中已经有转义映射关系的字符,按照之前的映射关系转义。
- 3. 按照转义规则替换source_str中的字符,并得到最终的结果。
- (以上解释比较绕,可以简单的将from_str和to_str看做等长,长度不够的位用空字符代替,然后再转义source_str)
现将source_str中非特定字符删掉,然后再统计长度。(注意:需要在from_str前面拼接上特定字符)
删掉source_str中非特定字符的内容,如下图:
统计特定字符在source_str中出现的次数,
select length(translate(',abc,,,d,,ef,', ',' || ',abc,,,d,,ef,', ',')) from dual;
如下图:
方式三,组合几个函数的结果:
select length(',abc,,,d,,ef,') - length(replace(',abc,,,d,,ef,', ',','')) from dual;
如下图:
--------------------需求二---------------
这里不要使用translate函数, 只有极少数情况下能满足需求。
组合使用length函数,regexp_replace函数获取结果,如下图:
替换字符串中的特定字符串:
计算出现的次数:
select (length('@-ab@@cd--ef@h-j') - length(regexp_replace('@-ab@@cd--ef@h-j','@-'))) / length('@-') from dual;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。