我想要一个正则表达式来代表所有可能的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
答案 0 :(得分:12)
我最近需要这个,所以我创建了一个完全遵循RFC-2253的LDAPv3专有名称语法。
attributeType可以用2种方式表示。以alpha开头的字母数字字符串,使用:
进行验证 [A-Za-z][\w-]*
或者它可以是OID,使用以下方式验证:
\d+(?:\.\d+)*
所以attributeType使用:
验证 [A-Za-z][\w-]*|\d+(?:\.\d+)*
attributeValue可以用3种方式表示。十六进制字符串,是一对带有前导#
的十六进制对的序列。十六进制字符串使用:
#(?:[\dA-Fa-f]{2})+
或转义字符串;每个非特殊字符都表示为&#34; as-is&#34; (使用[^,=\+<>#;\\"]
验证)。特殊字符可以使用前导\
表示(使用\\[,=\+<>#;\\"]
验证)。最后,任何字符都可以表示为带有前导\
的十六进制对(使用\\[\dA-Fa-f]{2}
进行验证)。转义字符串使用以下内容验证:
(?:[^,=\+<>#;\\"]|\\[,=\+<>#;\\"]|\\[\dA-Fa-f]{2})*
或带引号的字符串;该值以"
开头和结尾,并且可以包含除\
和"
之外的任何未转义的字符。另外,可以使用来自上述转义字符串的任何方法。带引号的字符串使用:
"(?:[^\\"]|\\[,=\+<>#;\\"]|\\[\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
在RegEx中:
(?#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)
在RegEx中:
(?#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})*"))*)*$
答案 1 :(得分:1)
这不仅不可能,它永远不会起作用,甚至不应该尝试。 LDAP数据(在本例中为可分辨名称)不是字符串。可分辨名称具有distinguishedName
语法,该语法不是字符串,并且必须使用目录服务器模式中定义的匹配规则进行比较。因此,正则表达式和本地语言比较,相对值和相等操作(如perl的~~
,eq
和==
以及Java的==
不能与LDAP数据一起使用 - 如果程序员尝试这样做,可能会发生意外结果,代码脆弱,易碎,不可预测,并且没有可重复的特征。不支持匹配规则的语言LDAP API 与LDAP一起使用,需要进行比较,相等检查和相对值排序比较。
举例来说,从LDAP角度来看,可分辨名称“dc=example,dc=com
”和“DC=example, DC=COM
”在各方面都是等效的,但是本机语言相等运算符将返回false
。 / p>
答案 2 :(得分: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
表达式已经被Regex转义,所以为了避免重复C#中的所有反斜杠,请确保在字符串前加上非转义的文字@符号,即
var dnExpression = @"...";
这将产生四个组,第一个是整个字符串的副本,第二个是最后一个RDN的副本,第三个和第四个是键/值对。您可以使用每个组的Captures集合索引每个键/值。
您也可以通过将表达式剪切为&#34;(?...)&#34;来验证RDN。通常&#34; ^ ... $&#34;包围的群体需要一个完整的值(字符串的开头)。
我允许使用十六进制特殊字符转义&#34; \&#34;,简单字符转义&#34; \&#34;或者除了&#34;,= \&#34;在键/值DN文本内。我猜这个表达式可以通过花费额外的时间来完成MSDN AD标准并限制允许的字符与确切的或不允许的内容相匹配来完善。但我相信这是一个好的开始。
答案 3 :(得分:-1)
我创建了一个。工作得很好。
^(\w+[=]{1}\w+)([,{1}]\w+[=]{1}\w+)*$