Регулярное выражение для разбора различающегося имени Active Directory

Значение отличительного имени в AD обычно имеет следующий формат:

CN=lastName\,firstName,OU=Users - XYZ,OU=Users-Test Place,OU=UsersAll,DC=Dom1,DC=Dom2

Я хотел бы проанализировать его с помощью регулярного выражения и вернуть следующие значения

CN=lastName\, firstName
OU=Users - XYZ
OU=Users-Test Place
OU=UsersAll
DC=Dom1
DC=Dom2

Шаблон "\w+=\w+" не помог.

Я вижу проблему, но не могу найти решение.

Спасибо за вашу помощь.


person RT.    schedule 13.09.2012    source источник
comment
С какого языка/платформы вы пытаетесь это сделать? То есть регулярные выражения, вероятно, просто не лучший выбор для этого. Используйте что-то, что предназначено для разбора этих имен, например. javax.naming.Name в Java.   -  person ziesemer    schedule 14.09.2012
comment
Я пытаюсь разобрать в PowerShell 2.0   -  person RT.    schedule 14.09.2012


Ответы (1)


Синтаксис отличительных имен изложен в RFC 4514 (который заменяет RFC 2253), и его нельзя полностью разобрать с помощью регулярного выражения. OpenLDAP содержит некоторые библиотечные функции, которые будут выполнять синтаксический анализ и проверку правильности. Однако, если вам нужно быстрое и грязное регулярное выражение, вы можете использовать следующий Posix ERE: ([^\,]|\\.)* (В Perl, Python или других языках с подобными расширениями регулярных выражений используйте (?:[^\,]|\\.)*, чтобы избежать ненужного захвата.)

Это означает «соответствовать любой последовательности символов, кроме , и \, возможно, также включая пары \ и любой одиночный символ». Это надмножество фактической спецификации LDAP, которая не позволяет \ сопровождаться чем-либо, кроме шестнадцатеричных цифр или одного из нескольких специальных символов, поэтому он будет принимать ряд недопустимых компонентов DN, но он должен принимать все допустимые единицы и, я думаю, никогда не проглотит запятую, разделяющую компоненты DN.

Вот простой тест в bash с использованием grep:

$ echo 'CN=lastName\, firstName,OU=Users - XYZ,OU=Users-Test Place,OU=UsersAll,DC=Dom1,DC=Dom2' |
> grep -oE '([^\,]|\\.)*'
CN=lastName\, firstName
OU=Users - XYZ
OU=Users-Test Place
OU=UsersAll
DC=Dom1
DC=Dom2
person rici    schedule 14.09.2012