第一组
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’ 找到的下一个满足'[^,]*'的字符串为空,返回结果
------解决方案--------------------
'*' 匹配前面的子表达式零次或多次,0次的情况下,‘,’也会占一个位置,但是返回的值是null。
也就是说当你用'*'的时候,‘,’也会占一个位置。
而(+)则只将其剔除掉了