可能性のあるすべてのタイプの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
これは不可能であるだけでなく、決して機能せず、試みるべきではありません。LDAP データ (この場合は識別名) は文字列ではありません。識別名にはdistinguishedName
文字列ではない構文があり、ディレクトリ サーバー スキーマで定義された一致規則を使用して比較を行う必要があります。このため、正規表現と母国語の比較、相対値、および perl や Java のような等価演算~~
はeq
LDAP==
データ==
では使用できません。プログラマーがこれを試みると、予期しない結果が発生する可能性があり、コードは脆く、壊れやすく、予測不可能です。 、再現性がありません。一致ルールをサポートしない言語 LDAP API は使用できません比較、等価性チェック、および相対値順序比較が必要な LDAP を使用します。
例として、識別名 " dc=example,dc=com
" と " DC=example, DC=COM
" は LDAP の観点からはあらゆる点で同等ですが、母国語の等価演算子は を返し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 = @"...";
これにより、4 つのグループが生成されます。最初は文字列全体のコピー、2 番目は最後の RDN のコピー、3 番目と 4 番目はキーと値のペアです。各グループの Captures コレクションを使用して、各キー/値にインデックスを付けることができます。
これを使用して、式を通常の「^...$」で囲まれた「(?...)」グループに切り取り、値全体 (文字列の開始-終了) を要求することで、RDN を検証することもできます。
キー/値 DN テキスト内で、16 進特殊文字エスケープ「\」、単純文字エスケープ「\」、または「,=\」以外を許可しました。この表現は、時間をかけて MSDN AD 標準を調べ、許可されている文字と許可されていない文字が正確に一致するように制限することで完成できると思います。しかし、これは良いスタートだと思います。
作成しました。素晴らしい仕事。
^(\w+[=]{1}\w+)([,{1}]\w+[=]{1}\w+)*$