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.
user2有ou=org2,ou=suborg1,o=myorg哪些是org2不匹配的.
user4不会匹配suborg2,...变化是无限的,所以我喜欢只寻找完全匹配ou=org1,ou=suborg1,o=myorg.
我知道怎么做,replace但它不能处理无限的场景.是否有干净的方式来做regexp_replace或regexp_extract?
可能最干净的是使用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+字符匹配到字符串的末尾.
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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |