[英]javascript regular expression for 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
我最近需要這個,所以我創建了一個完全遵循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})+
或逃脫的字符串; 每個非特殊字符都表示為“原樣”(使用[^,=\\+<>#;\\\\"]
)。特殊字符可以用前導\\
來表示(使用\\\\[,=\\+<>#;\\\\"]
驗證) \\\\[,=\\+<>#;\\\\"]
)。 最后,任何字符都可以表示為帶有前導\\
的十六進制對(使用\\\\[\\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})*"))*)*$
這不僅是不可能的,它永遠不會起作用,甚至不應該嘗試。 LDAP數據(在本例中為可分辨名稱)不是字符串。 可分辨名稱具有distinguishedName
語法,該語法不是字符串,並且必須使用目錄服務器模式中定義的匹配規則進行比較。 出於這個原因,正則表達式和本地語言比較,相對值和相等操作(如perl的~~
, eq
和==
以及Java的==
不能與LDAP數據一起使用 - 如果程序員嘗試這樣做,可能會發生意外結果,代碼脆弱,易碎,不可預測,並且沒有可重復的特征。 不支持匹配規則的語言LDAP API不能與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
表達式已經是Regex轉義的,所以為了避免在C#中重復所有的反斜杠,請確保在字符串前加上非轉義的文字@符號,即
var dnExpression = @"...";
這將產生四個組,首先是整個字符串的副本,第二個是最后一個RDN的副本,第三個和第四個是鍵/值對。 您可以使用每個組的Captures集合索引每個鍵/值。
你也可以使用它來通過將表達式切換到通常的“^ ... $”所包圍的“(?...)”組來驗證RDN,以獲得整個值(字符串的起始端)。
我允許在鍵/值DN文本中使用十六進制特殊字符轉義“\\”,簡單字符轉義“\\”或除“,= \\”以外的任何內容。 我猜這個表達式可以通過花費額外的時間來完成MSDN AD標准並限制允許的字符與正確或不允許的內容相匹配來完善。 但我相信這是一個好的開始。
我創造了一個。 工作得很好。
^(\w+[=]{1}\w+)([,{1}]\w+[=]{1}\w+)*$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.