使用Oracle REGEXP_SUBSTR提取字符串

ton*_*nyf 1 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,', ',', ''))
Run Code Online (Sandbox Code Playgroud)

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

CN=aTIGERAdmin-Admin,
CN=D0902498,
CN=ea90045052,
CN=aTIGERCall-Admin,
Run Code Online (Sandbox Code Playgroud)

并以这种格式,最后用逗号.

我现在这样做的方式是切断"CN =",但实际上我需要这部分.

spe*_*593 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,',',''))
Run Code Online (Sandbox Code Playgroud)

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

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

在11g中,REGEXP_COUNT函数可以替换您的"计数"计算事件.

CONNECT BY LEVEL <= REGEXP_COUNT(d.s,'CN=.*?,')
Run Code Online (Sandbox Code Playgroud)

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


附录:

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

LINE
-----------------------
CN=aTIGERAdmin-Admin,                                                 
CN=D0902498,                                                          
CN=ea90045052,                                                        
CN=aTIGERCall-Admin, 
Run Code Online (Sandbox Code Playgroud)