8

我想要一个正则表达式来消除所有类型的可能 DN

我创造了一个,但它不是那么好。

/([A-z0-9=]{1}[A-z0-9]{1})*[,??]/其他一些人通过改变它,但徒劳无功。

可能的 DN 可以是

CN=abcd,CN=abcd,O=abcd,C=us
CN=abcd0520,CN=users,O=abcd,C=us
C=us

etc
4

4 回答 4

16

我最近需要这个,所以我创建了一个完全遵循RFC-2253中的 LDAPv3 专有名称语法的。

属性类型

一个attributeType 可以用两种方式表示。以 alpha 开头的字母数字字符串,使用以下方法验证:

[A-Za-z][\w-]*

或者它可以是一个 OID,使用以下方法进行验证:

\d+(?:\.\d+)*

因此 attributeType 使用以下方法进行验证:

[A-Za-z][\w-]*|\d+(?:\.\d+)*

属性值

一个属性值可以用 3 种方式表示。一个十六进制字符串,它是一个带有前导的十六进制对序列#。十六进制字符串验证使用:

#(?:[\dA-Fa-f]{2})+

或转义字符串;每个非特殊字符都“按原样”表示(使用 验证[^,=\+<>#;\\"])。特殊字符可以用前导表示\(使用 验证\\[,=\+<>#;\\"])。最后,任何字符都可以表示为带有前导的十六进制对\(使用 验证\\[\dA-Fa-f]{2})。转义字符串验证使用:

(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*

或带引号的字符串;该值以 , 开头和结尾,并且可以包含除and"之外的任何未转义字符。此外,可以使用上述转义字符串中的任何方法。带引号的字符串使用以下方法进行验证:\"

"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*"

所有结合起来,attributeValue 使用以下方法进行验证:

#(?:[\dA-Fa-f]{2})+|(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*|"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*"

名称组件

BNF 中的名称组件是:

name-component = attributeTypeAndValue *("+" attributeTypeAndValue)
attributeTypeAndValue = attributeType "=" attributeValue

在正则表达式中是:

(?#attributeType)=(?#attributeValue)(?:\+(?#attributeType)=(?#attributeValue))*

用上面的值替换(?#attributeType)(?#attributeValue)占位符给我们:

(?:[A-Za-z][\w-]*|\d+(?:\.\d+)*)=(?:#(?:[\dA-Fa-f]{2})+|(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*|"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*")(?:\+(?:[A-Za-z][\w-]*|\d+(?:\.\d+)*)=(?:#(?:[\dA-Fa-f]{2})+|(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*|"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*"))*

它验证单个名称组件。

专有名称

最后,专有名称的 BNF 是:

name-component *("," name-component)

在正则表达式中是:

(?#name-component)(?:,(?#name-component))*

用上面的值替换 (?#name-component) 占位符给我们:

^(?:[A-Za-z][\w-]*|\d+(?:\.\d+)*)=(?:#(?:[\dA-Fa-f]{2})+|(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*|"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*")(?:\+(?:[A-Za-z][\w-]*|\d+(?:\.\d+)*)=(?:#(?:[\dA-Fa-f]{2})+|(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*|"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*"))*(?:,(?:[A-Za-z][\w-]*|\d+(?:\.\d+)*)=(?:#(?:[\dA-Fa-f]{2})+|(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*|"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*")(?:\+(?:[A-Za-z][\w-]*|\d+(?:\.\d+)*)=(?:#(?:[\dA-Fa-f]{2})+|(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*|"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*"))*)*$

在这里测试

于 2014-10-21T17:19:11.447 回答
2

这不仅不可能,而且永远不会奏效,甚至不应该尝试。LDAP 数据(在这种情况下为专有名称)不是字符串。专有名称具有distinguishedName不是字符串的语法,并且必须使用目录服务器模式中定义的匹配规则进行比较。由于这个原因,正则表达式和本地语言比较、相对值和相等操作(如 perl和~~Java )不能用于 LDAP 数据 - 如果程序员尝试这样做,可能会出现意外结果并且代码易碎、易碎、不可预测,并且不具有可重复的特征。不能使用不支持匹配规则的语言 LDAP APIeq====在需要比较、相等检查和相对值排序比较的 LDAP 中。

例如,从 LDAP 的角度来看,可分辨名称 " dc=example,dc=com" 和 " DC=example, DC=COM" 在各方面都是等效的,但本地语言相等运算符将返回false

于 2012-02-16T13:44:50.670 回答
0

这对我有用:

表达:

^(?<RDN>(?<Key>(?:\\[0-9A-Fa-f]{2}|\\\[^=\,\\]|[^=\,\\]+)+)\=(?<Value>(?:\\[0-9A-Fa-f]{2}|\\\[^=\,\\]|[^=\,\\]+)+))(?:\s*\,\s*(?<RDN>(?<Key>(?:\\[0-9A-Fa-f]{2}|\\\[^=\,\\]|[^=\,\\]+)+)\=(?<Value>(?:\\[0-9A-Fa-f]{2}|\\\[^=\,\\]|[^=\,\\]+)+)))*$

测试:

CN=Test User Delete\0ADEL:c1104f63-0389-4d25-8e03-822a5c3616bc,CN=Deleted Objects,DC=test,DC=domain,DC=local

该表达式已经被正则表达式转义,因此为了避免在 C# 中重复所有反斜杠,请确保在字符串前面加上非转义文字 @ 符号,即

var dnExpression = @"...";

这将产生四个组,第一个是整个字符串的副本,第二个是最后一个 RDN 的副本,第三个和第四个是键/值对。您可以使用每个组的 Captures 集合来索引每个键/值。

您还可以使用它来验证 RDN,方法是将表达式切割到由通常的 "^...$" 包围的 "(?...)" 组,以要求一个完整的值(字符串的开始-结束)。

我允许在键/值 DN 文本中使用十六进制特殊字符转义“\”、简单字符转义“\”或“,=\”以外的任何内容。我猜想这个表达式可以通过花额外的时间来完善 MSDN AD 标准并限制允许的字符以完全匹配允许或不允许的字符。但我相信这是一个好的开始。

于 2014-05-26T07:40:48.547 回答
-1

我创造了一个。工作很棒。

^(\w+[=]{1}\w+)([,{1}]\w+[=]{1}\w+)*$
于 2012-02-22T06:36:40.763 回答