regexp_count,查找符带星号(*)会多统计一个空格数(未知原因)

先上图:

SQL> Select Length('11,22223,435,567') From dual;

LENGTH('11,22223,435,567')
--------------------------
                        16
--(这个字符串长度才16个,但下面用‘*’的统计结果却有17个)

SQL> Select regexp_count('11,22223,435,567',',*') From dual;

REGEXP_COUNT('11,22223,435,567',',*')
-------------------------------------
                                   17
---(注意‘ * ’ 和 ‘ + ’的区别)
SQL> Select regexp_count('11,22223,435,567',',+') From dual;

REGEXP_COUNT('11,22223,435,567',',+')
-------------------------------------
                                    3

 我用的是11g版本的oracle,尝试字符拆分看看‘  *   ’‘  +  ’ 的区别

SQL> Select regexp_substr(str,'[, ]*',1,Level,'i') str
  2  From (Select '11,22223,435,567' str From dual)
  3  Connect By Level<=regexp_count(str,'[, ]*');

STR
--------------------------------------------------------------------------------------------------------------------------------


,





,



,





已选择17行。



SQL> Select regexp_substr(str,'[, ]+',1,Level,'i') str
  2  From (Select '11,22223,435,567' str From dual)
  3  Connect By Level<=regexp_count(str,'[, ]+');

STR
--------------------------------------------------------------------------------------------------------------------------------
,
,
,

已选择3行。

同样是对‘  ,’进行查找,结果却很不一样,

‘  *  ’   匹配前面的子表达式零次或多次

‘  +  ’   匹配前面的子表达式一次或多次

(我有一个猜想,这两个元字符都对字符串的字符进行逐一判断:

‘ + ’必须至少要有一次匹配上,匹配不上的直接过滤掉,所以只能找到3条数据;

‘  *  ’可以有零次匹配上,即匹配不上他返回一个空值,所以应该有13行空值行,3行‘  ,  ’行,!!!重点就是最后多出一行空值行,这个很费解-_-||

(做了多次测试都是最后出现空值,这让我怀疑是不是regexp_count统计有问题,所以我把查找字段直接设为空

SQL> Select regexp_substr(str,'',1,Level,'i') str
  2  From (Select '11,22223,435,567,' str From dual)
  3  Connect By Level<=regexp_count(str,'');

STR
------------------------------------------------------------------------------------------------------------------------------------


已选择 1 行。

(所以我在想最后一个空值会不会是‘ * ’对每个字符做完判断之后又对整个字符串做了上面的空值查找)

(这个问题想了好几天了,完全不知道怎么去验证,想法始终是想法!-_-||

看看有没有高手知道~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值