当前位置: 代码迷 >> Oracle开发 >> 请帮忙解释下这两个正则表达式话语返回结果为何不同
  详细解决方案

请帮忙解释下这两个正则表达式话语返回结果为何不同

热度:134   发布时间:2016-04-24 06:37:36.0
请帮忙解释下这两个正则表达式语句返回结果为何不同
第一组
select  REGEXP_SUBSTR('34,56,-23','[^,]+',1,1,'i') AS STR FROM DUAL;  --结果为34
select  REGEXP_SUBSTR('34,56,-23','[^,]*',1,1,'i') AS STR FROM DUAL;  --结果为34

第二组
select  REGEXP_SUBSTR('34,56,-23','[^,]+',1,2,'i') AS STR FROM DUAL;  --结果为56
select  REGEXP_SUBSTR('34,56,-23','[^,]*',1,2,'i') AS STR FROM DUAL;  --结果为null

第三组
select  REGEXP_SUBSTR('34,56,-23','[^,]+',1,3,'i') AS STR FROM DUAL;  ---结果为-23
select  REGEXP_SUBSTR('34,56,-23','[^,]*',1,3,'i') AS STR FROM DUAL;  ---结果为56

请帮忙给解释一下第二组、第三组为何会得出那样的结果,我原以为[^,]*应该和[^,]+返回的结果是一样的。有劳各位费心。

------解决方案--------------------
REGEXP_SUBSTR('34,56,-23','[^,]*',1,2,'i') 
执行顺序
1、找到第一个满足表达式的字符串为34
2、把第一个字符串从原始字符串中去除,即‘,56,-23’
3、从字符串‘,56,-23’ 找到的下一个满足'[^,]*'的字符串为空,返回结果
------解决方案--------------------
引用:
Quote: 引用:

REGEXP_SUBSTR('34,56,-23','[^,]*',1,2,'i') 
执行顺序
1、找到第一个满足表达式的字符串为34
2、把第一个字符串从原始字符串中去除,即‘,56,-23’
3、从字符串‘,56,-23’ 找到的下一个满足'[^,]*'的字符串为空,返回结果

56不就满足'[^,]*‘么。。。。

'*' 匹配前面的子表达式零次或多次,0次的情况下,‘,’也会占一个位置,但是返回的值是null。
也就是说当你用'*'的时候,‘,’也会占一个位置。
而(+)则只将其剔除掉了