1

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

4

2 回答 2

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, 
于 2012-06-25T18:24:41.380 回答
0

我不是 LDAP 大师,但正则表达式CN=[^,]+( C, then N, then 等号,贪婪地后跟多个非逗号) 对你有用吗?

另外,您知道REGEXP_COUNT11g 中的新功能吗?

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>
于 2012-06-25T18:02:03.027 回答