我在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 =”,但实际上我需要这部分。
答案 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>