Postgres中的Regex在OpenLDAP中提取完整的DN

HP.*_*HP. 6 regex sql postgresql

我有一个程序将OpenLDAP中的用户的完整字符串组传递给Postgres查询.字符串完全是这样的:

( 'cn=user1,ou=org1,ou=suborg1,o=myorg','cn=user2,ou=org2,ou=suborg1,o=myorg','cn=user3,ou=org1,ou=suborg1,o=myorg','cn=user4,ou=org1,ou=suborg2,o=myorg' )
Run Code Online (Sandbox Code Playgroud)

在查询中,我只想在Postgres中使用它:

'user1','user3'
Run Code Online (Sandbox Code Playgroud)

基本上提取cn=字符串其余部分时的值ou=org1,ou=suborg1,o=myorg.

user2ou=org2,ou=suborg1,o=myorg哪些是org2不匹配的. user4不会匹配suborg2,...变化是无限的,所以我喜欢只寻找完全匹配ou=org1,ou=suborg1,o=myorg.

我知道怎么做,replace但它不能处理无限的场景.是否有干净的方式来做regexp_replaceregexp_extract

Wik*_*żew 7

可能最干净的是使用SUBSTRING它可以只返回捕获的子字符串:

SELECT SUBSTRING(strs FROM 'cn=([^,]+),ou=org1,ou=suborg1,o=myorg') FROM tb1;
Run Code Online (Sandbox Code Playgroud)

在这里,您匹配cn=,然后捕获除了,使用否定括号表达式之外的任何一个或多个字符的第1组[^,]+,然后匹配,ou=org1,ou=suborg1,o=myorg以确保存在您所需的右手上下文.

否则,您可以尝试一种REGEXP_REPLACE方法,但它会保留未找到匹配的值:

SELECT REGEXP_REPLACE(strs, '.*cn=([^,]+),ou=org1,ou=suborg1,o=myorg.*', '\1') from tb1;
Run Code Online (Sandbox Code Playgroud)

它匹配任何0+字符.*,然后cn=再次将非逗号字符捕获到组1中,然后将0 ,ou=org1,ou=suborg1,o=myorg+字符匹配到字符串的末尾.

查看在线PostgreSQL演示:

CREATE TABLE tb1
    (strs character varying)
;

INSERT INTO tb1
    (strs)
VALUES
    ('cn=user1,ou=org1,ou=suborg1,o=myorg'),
    ('cn=user2,ou=org2,ou=suborg1,o=myorg'),
    ('cn=user3,ou=org1,ou=suborg1,o=myorg'),
    ('cn=user4,ou=org1,ou=suborg2,o=myorg')
;

SELECT REGEXP_REPLACE(strs, '.*cn=([^,]+),ou=org1,ou=suborg1,o=myorg.*', '\1') from tb1;
SELECT substring(strs from 'cn=([^,]+),ou=org1,ou=suborg1,o=myorg') from tb1;
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

注意,您可以利用一个非常有用的字边界 \y构造(参阅表9.20.正则表达式约束逃逸),如果你不想匹配ocn=cn=,

'.*\ycn=([^,]+),ou=org1,ou=suborg1,o=myorg\y.*'
   ^^                                     ^^
Run Code Online (Sandbox Code Playgroud)