Вероятно, самым чистым является использование SUBSTRING
, которое может вернуть только захваченную подстроку:
SELECT SUBSTRING(strs FROM 'cn=([^,]+),ou=org1,ou=suborg1,o=myorg') FROM tb1;
Здесь вы сопоставляете cn=
, затем записываете в Группу 1 любой один или несколько символов, отличных от ,
с выражением в отрицательной скобке [^,]+
, а затем сопоставляете ,ou=org1,ou=suborg1,o=myorg
, чтобы убедиться, что есть требуемая правая рука контекст.
Иначе, вы можете попробовать подход REGEXP_REPLACE
, но при этом значения, в которых не найдено совпадений, останутся без изменений:
SELECT REGEXP_REPLACE(strs, '.*cn=([^,]+),ou=org1,ou=suborg1,o=myorg.*', '\1') from tb1;
Соответствует любым 0+ символам с .*
, затем cn=
, снова захватывает символы без запятой в Группу 1 и затем сопоставляет ,ou=org1,ou=suborg1,o=myorg
и 0+ символов до конца строки.
См. онлайн-демонстрацию 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;
Результаты:
Обратите внимание, что вы можете использовать очень полезную границу слова \y
(см. Таблица 9.20. Побег ограничения регулярного выражения ), если вы не хотите совпадение ocn=
с cn=
,
'.*\ycn=([^,]+),ou=org1,ou=suborg1,o=myorg\y.*'
^^ ^^