我想要一个正则表达式来消除所有类型的可能 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
我想要一个正则表达式来消除所有类型的可能 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
我最近需要这个,所以我创建了一个完全遵循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})*"))*)*$
这不仅不可能,而且永远不会奏效,甚至不应该尝试。LDAP 数据(在这种情况下为专有名称)不是字符串。专有名称具有distinguishedName
不是字符串的语法,并且必须使用目录服务器模式中定义的匹配规则进行比较。由于这个原因,正则表达式和本地语言比较、相对值和相等操作(如 perl和~~
Java )不能用于 LDAP 数据 - 如果程序员尝试这样做,可能会出现意外结果并且代码易碎、易碎、不可预测,并且不具有可重复的特征。不能使用不支持匹配规则的语言 LDAP APIeq
==
==
在需要比较、相等检查和相对值排序比较的 LDAP 中。
例如,从 LDAP 的角度来看,可分辨名称 " dc=example,dc=com
" 和 " DC=example, DC=COM
" 在各方面都是等效的,但本地语言相等运算符将返回false
。
这对我有用:
表达:
^(?<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 标准并限制允许的字符以完全匹配允许或不允许的字符。但我相信这是一个好的开始。
我创造了一个。工作很棒。
^(\w+[=]{1}\w+)([,{1}]\w+[=]{1}\w+)*$