用于解析Active Directory distinguishedName的正则表达式

时间:2012-09-13 22:13:58

标签: regex parsing active-directory distinguishedname

AD中distinguishedname的值通常采用以下格式:

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 +”没有帮助。

我看到了问题,但我找不到解决方案。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

可分辨名称的语法在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