簡體   English   中英

DN的javascript正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM