使用Oracle REGEXP_SUBSTR提取字符串

时间:2012-06-25 16:50:26

标签: regex oracle oracle11g regexp-substr

我在Oracle 11g中使用REGEXP_SUBSTR,我在尝试提取以下字符串时遇到了困难。

我的查询是:

SELECT regexp_substr('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', '[^CN=]*\,', 1, rownum) line
 FROM dual
 CONNECT BY LEVEL <= length('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,') - 
                     length(REPLACE('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', ',', ''))

从这个查询中,我在尝试匹配精确字符串'CN ='时遇到问题,因此我需要输出显示如下:

CN=aTIGERAdmin-Admin,
CN=D0902498,
CN=ea90045052,
CN=aTIGERCall-Admin,

以这种格式,最后用逗号。

我现在这样做的方法是砍掉“CN =”,但实际上我需要这部分。

2 个答案:

答案 0 :(得分:5)

我认为这将返回您正在寻找的结果集:

SELECT REGEXP_SUBSTR(d.s,'CN=.*?,', 1, ROWNUM) line
  FROM (SELECT 'CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,'
        AS s FROM dual) d
CONNECT BY LEVEL <= LENGTH(d.s) - LENGTH(REPLACE(d.s,',',''))

这里使用的正则表达式技巧是指定?修饰符(在.*之后)以使匹配“非贪婪”。默认匹配(没有?修饰符)是“贪婪的”,因为它将匹配尽可能多的字符串。在您的情况下,您希望匹配结束于找到的第一个逗号。这里的目的是匹配文字字符串'CN =',后跟任意数量的字符(零,一个或多个),直到遇到的第一个逗号。

这适用于Oracle 10g以及11g。

在11g中,REGEXP_COUNT函数可以替换您的“计数”计算事件。

CONNECT BY LEVEL <= REGEXP_COUNT(d.s,'CN=.*?,')

(顺便说一下......通过使用子查询返回文字字符串,文字字符串只需要指定一次。这样可以更容易地更改字符串进行测试,而不必在多个位置更改它。 )


附录:

我可以确认逗号包含在返回值中。样本输出:

LINE
-----------------------
CN=aTIGERAdmin-Admin,                                                 
CN=D0902498,                                                          
CN=ea90045052,                                                        
CN=aTIGERCall-Admin, 

答案 1 :(得分:0)

我不是LDAP主人,但是正则表达式CN=[^,]+C,然后是N,然后等于符号,贪婪地跟着多个非逗号)工作为你?

另外,你知道{11}中的REGEXP_COUNT新内容吗?

SQL> SELECT REGEXP_SUBSTR('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', 'CN=[^,]+', 1, ROWNUM) line
  2   FROM dual
  3   CONNECT BY LEVEL <= REGEXP_COUNT('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', 'CN=[^,]+')
  4  /

LINE
----------------------------------------------------------------------------------------------------
CN=aTIGERAdmin-Admin
CN=D0902498
CN=ea90045052
CN=aTIGERCall-Admin

SQL>