找到由管道

时间:2018-01-18 14:59:00

标签: regex db2 db2-400

我是Regex的新手,想知道是否可以这样做。

可以在字符串中找到子字符串的标记位置,如下面的示例文本?

AA|BBBBBBBBBB|XXXX||XXXX||FFFFFFFFFFF

请求第一次出现'XXXX'的位置我必须得到'3',要求第二次出现'XXXX'我必须得到'5',要求第三次出现'XXXX'我必须得到'0'因为没有第三次发生。

这可以使用正则表达式来完成吗?

提前致谢。

PS:如果有可能,我将使用REGEX函数在DB2 v7r2上实现此解决方案,以替换我在很久以前在PLSQL上编写的UDF来完成这项工作。

1 个答案:

答案 0 :(得分:1)

这不是我通常如何使用正则表达式....

但它可以完成工作......

create variable mysource varchar(50)         
    default('AA|BBBBBBBBBB|XXXX||XXXX||FFFFFFFFFFF');


select                                   
 regexp_count(                           
      substring(mysource                 
               , 1                       
               ,regexp_instr(mysource    
                            ,'XXXX'      
                            ,1
                            ,2  --occurance
                            ,1)      
               )                         
      ,'\|')                             
from sysibm.sysdummy1;

REGEXP_COUNT
           5

如果模式可能落在最后位置,可能需要将'|'连接到源的末尾。

编辑

好的,这是一种完全不同的方式......使用递归公用表表达式(RCTE)

请注意,如果您确保文本以分隔符结尾,则解决方案最简单......

create variable mysource varchar(50)         
    default('AA|BBBBBBBBBB|XXXX||XXXX||FFFFFFFFFFF|');

代码..

with splitstring (pos, data, remain) as (           
  select 1                                          
   , substring(mysource,1,locate('|', mysource) -1 )
   , substring(mysource,locate('|', mysource) + 1 ) 
  from sysibm.sysdummy1                             
union all                                           
  select pos + 1                                    
   , substring(remain,1,locate('|', remain) -1 )    
   , substring(remain,locate('|', remain) + 1 )     
, matches as (                                      
select row_number() over (order by pos) as occur    
       ,pos                                         
from splitString                                    
where data = 'XXXX'                                 
)                                                   
select coalesce(pos,0) as pos           
from sysibm.sysdummy1            
    left join matches 
     on occur = 2   ;

结果

   POS
     5