DN的javascript正则表达式

时间:2012-02-15 07:19:31

标签: javascript regex ldap dn

我想要一个正则表达式来代表所有可能的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 个答案:

答案 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})*"))*)*$

Test it here

答案 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+)*$