正则表达式返回匹配项的起始位置和长度?

[复制链接]
查看11 | 回复6 | 2015-3-4 14:55:27 | 显示全部楼层 |阅读模式
本帖最后由 komicakomica 于 2015-4-17 22:21 编辑
如题,对于一个输入字符串,我希望返回所有匹配项的起始位置和长度。
例如,输入'ABCDEFB',匹配模式'[BERZ]',希望能得到下面的结果
SEQPOSLENTOKEN
121 B
251 E
371 B
不靠java/c函数,只用数据库本身的功能可以实现吗?
回复

使用道具 举报

千问 | 2015-3-4 14:55:27 | 显示全部楼层
本帖最后由 xhhjj 于 2015-4-18 11:07 编辑
只做了匹配一位的,匹配多位的得把所有集合列出来,11gr2可以使用递归with语句构造,
请参考版主的帖子
求所有子集合及其补集:40楼
http://www.itpub.net/thread-1289332-4-2.html
with a as (
select level lv,substr('ABCDEFB',level,1) atoken
from dual
connect by level <= length('ABCDEFB')
),
b as (
select level lv,substr('BERZ',level,1) btoken
from dual
connect by level <= length('BERZ')
)
select row_number() over(order by a.lv) rn,a.lv,a.atoken
from a,b
where a.atoken = b.btoken
order by a.lv

回复

使用道具 举报

千问 | 2015-3-4 14:55:27 | 显示全部楼层
xhhjj 发表于 2015-4-18 11:00
只做了匹配一位的,匹配多位的得把所有集合列出来,11gr2可以使用递归with语句构造,
请参考版主的帖子
求 ...

注意匹配的模式不是固定的,任意长度(不同匹配项的长度可以不等)、任意字符都可能出现。
拿http://www.itpub.net/thread-1289332-4-2.html这里40L的例子来说:
分隔符长度可以不固定,比如可以是长度1-5的字母+数字串([A-Z0-9]{1,5}),甚至可以是一个email地址([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})。
被分割元素的长度也不固定,不一定是1,这样就不能通过长度判断元素个数了。
而且这里要给出一个可以处理任何输入的通用函数。

回复

使用道具 举报

千问 | 2015-3-4 14:55:27 | 显示全部楼层
不用connect by和with也可以解决?!
回复

使用道具 举报

千问 | 2015-3-4 14:55:27 | 显示全部楼层
先用regexp_substr()把每一个匹配到的值拿出来算长度,然后instr算位置
回复

使用道具 举报

千问 | 2015-3-4 14:55:27 | 显示全部楼层
komicakomica 发表于 2015-4-18 13:07
注意匹配的模式不是固定的,任意长度(不同匹配项的长度可以不等)、任意字符都可能出现。
拿http://www ...

自己编写一个吧
回复

使用道具 举报

千问 | 2015-3-4 14:55:27 | 显示全部楼层
dageji111 发表于 2015-4-18 23:10
先用regexp_substr()把每一个匹配到的值拿出来算长度,然后instr算位置

没这么简单,有些匹配项可能被包含在另外的匹配项里。
比如输入'ab123ababc34ab',匹配模式'ababc|ab',你用instr怎么判断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行