我是Regex的新手,想知道是否可以这样做。
可以在字符串中找到子字符串的标记位置,如下面的示例文本?
AA|BBBBBBBBBB|XXXX||XXXX||FFFFFFFFFFF
请求第一次出现'XXXX'的位置我必须得到'3',要求第二次出现'XXXX'我必须得到'5',要求第三次出现'XXXX'我必须得到'0'因为没有第三次发生。
这可以使用正则表达式来完成吗?
提前致谢。
PS:如果有可能,我将使用REGEX函数在DB2 v7r2上实现此解决方案,以替换我在很久以前在PLSQL上编写的UDF来完成这项工作。答案 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