请教一个正则表达式问题

[复制链接]
查看11 | 回复9 | 2008-8-26 12:36:25 | 显示全部楼层 |阅读模式
请教怎么用正则表达式提取最后[]里的数字,如:[ABCD].TEST.DATA.ITEM[0]
[ABCD].TEST.DATA.ITEM[0]
[DEV].TEST.DATA.ITEM[9]
[BBB].TEST.DATA.ITEM[10]
[CCC].TEST.DATA.ITEM[11]
[DDDDEF].TEST.DATA.ITEM[100]
得到:
0
9
10
11
100
谢谢!
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层


SQL> with tmp as
2(
3select '[ABCD].TEST.DATA.ITEM[0]' str from dual
4union all
5select '[DEV].TEST.DATA.ITEM[9]' str from dual
6union all
7select '[BBB].TEST.DATA.ITEM[10]' str from dual
8union all
9select '[CCC].TEST.DATA.ITEM[11]' str from dual
10union all
11select '[DDDDEF].TEST.DATA.ITEM[100]' str from dual
12)
13select str,
14 substr(str, instr(str, '[', -1) + 1, instr(str, ']', -1) - instr(str, '[', -1)-1) results
15from tmp;
STR
RESULTS
---------------------------- --------------------------------------------------------
[ABCD].TEST.DATA.ITEM[0] 0
[DEV].TEST.DATA.ITEM[9]9
[BBB].TEST.DATA.ITEM[10] 10
[CCC].TEST.DATA.ITEM[11] 11
[DDDDEF].TEST.DATA.ITEM[100] 100
SQL>

[ 本帖最后由 bell6248 于 2009-3-6 14:27 编辑 ]
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
能有简单点的正则表达式提取吗?
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
正则是吧
with tmp as
(
select '[ABCD].TEST.DATA.ITEM[0]' str from dual
union all
select '[DEV].TEST.DATA.ITEM[9]' str from dual
union all
select '[BBB].TEST.DATA.ITEM[10]' str from dual
union all
select '[CCC].TEST.DATA.ITEM[11]' str from dual
union all
select '[DDDDEF].TEST.DATA.ITEM[100]' str from dual
)
select str,regexp_substr(str,'\d+') from tmp;
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
oracle里面支持\d的写法吗??
这不是perl的写法吗??
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
借用一下

,lz试一下吧,我也是刚开始学



with tmp as
(
select '[ABCD].TEST.DATA.ITEM[0]' str from dual
union all
select '[DEV].TEST.DATA.ITEM[9]' str from dual
union all
select '.TEST.DATA.ITEM[10]' str from dual
union all
select '[CCC].TEST.DATA.ITEM[11]' str from dual
union all
select '[DDDDEF].TEST.DATA.ITEM[100]' str from dual
)
select str,regexp_substr(str,'\[[[:digit:]]+\]') from tmp;



原帖由 dingjun123 于 2009-3-6 16:31 发表
正则是吧
with tmp as
(
select '[ABCD].TEST.DATA.ITEM[0]' str from dual
union all
select '[DEV].TEST.DATA.ITEM[9]' str from dual
union all
select '.TEST.DATA.ITEM[10]' str from dual
union all
select '[CCC].TEST.DATA.ITEM[11]' str from dual
union all
select '[DDDDEF].TEST.DATA.ITEM[100]' str from dual
)
select str,regexp_substr(str,'\d+') from tmp;

[ 本帖最后由 zhitler 于 2009-3-6 17:03 编辑 ]
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
原帖由 zhitler 于 2009-3-6 17:01 发表
oracle里面支持\d的写法吗??
这不是perl的写法吗??

正则java,unix,perl,oracle等都差不多的,有参考资料的,哈哈
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
WITH TEMP AS
(

SELECT '[ABCD].TEST.DATA.ITEM[0]' STR FROM DUAL
UNION
SELECT '[DEV].TEST.DATA.ITEM[9]' STRFROM DUAL
UNION
SELECT '[BBB].TEST.DATA.ITEM[10]' STR FROM DUAL
UNION
SELECT '[CCC].TEST.DATA.ITEM[11]' STR FROM DUAL
UNION
SELECT '[DDDDEF].TEST.DATA.ITEM[100]' STR FROM DUAL
)
SELECT TRIM(TRANSLATE(REGEXP_SUBSTR(STR,'[[0-9]+]',1,1),'[]',' ')) FROM TEMP
注意,上面的写法只适合第一个[]中不包含数字的情况。
如果前面的[]中也包含数字,而且最后的[]中也包含字母的情况用下面的语句
WITH TEMP AS
(

SELECT '[ABCD].TEST.DATA.ITEM[abcd]' STR FROM DUAL
UNION
SELECT '[DEV].TEST.DATA.ITEM[9]' STRFROM DUAL
UNION
SELECT '[BBB].TEST.DATA.ITEM[10asdf]' STR FROM DUAL
UNION
SELECT '[CCC].TEST.DATA.ITEM[11]' STR FROM DUAL
UNION
SELECT '[DDDDEF].TEST.DATA.ITEM[zzz100]' STR FROM DUAL
)
SELECT REVERSE(TRIM(TRANSLATE(REGEXP_SUBSTR(STR,'[]][[:alnum:]]+[[]',1,1),'[]',' '))) STR FROM (SELECT REVERSE(STR) STR FROM TEMP)
STR
------
abcd
10asdf
11
zzz100
9
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
多谢各位高人!
用 select str,regexp_substr(str,'\d+') from tmp 可以,但是如果前面的[]中有数字,就会拿到前面的数字而不是后面[]的数字了
比如[15].TEST.DATA.ITEM[0],会拿到10。
回复

使用道具 举报

千问 | 2008-8-26 12:36:25 | 显示全部楼层
WITH TEMP AS
(
SELECT '[10].TEST.DATA.ITEM[abcd]' STR FROM DUAL
UNION
SELECT '[11].TEST.DATA.ITEM[9]' STRFROM DUAL
UNION
SELECT '[12].TEST.DATA.ITEM[10asdf]' STR FROM DUAL
UNION
SELECT '[13].TEST.DATA.ITEM[11]' STR FROM DUAL
UNION
SELECT '[14].TEST.DATA.ITEM[zzz100]' STR FROM DUAL
)
SELECT REVERSE(TRIM(TRANSLATE(REGEXP_SUBSTR(STR,'[]][[:alnum:]]+[[]',1,1),'[]',' '))) STR FROM (SELECT REVERSE(STR) STR FROM TEMP)
1
abcd
2
9
3
10asdf
4
11
5
zzz100
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行