регулярное выражение JavaScript для DN - PullRequest
7 голосов
/ 15 февраля 2012

Я хочу регулярное выражение, чтобы определить все типы возможных 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 ]

12 голосов
/ 21 октября 2014

У меня недавно была потребность в этом, поэтому я создал тот, который полностью соответствует синтаксису отличительного имени LDAPv3 на RFC-2253 .

Тип атрибута

attributeType может быть выражен двумя способами. Буквенно-цифровая строка, которая начинается с буквы, проверяется с помощью:

[A-Za-z][\w-]*

Или это может быть OID, проверенный с помощью:

\d+(?:\.\d+)*

Итак, attributeType проверяется с использованием:

[A-Za-z][\w-]*|\d+(?:\.\d+)*

Значение атрибута

Значение атрибута может быть выражено тремя способами. Шестнадцатеричная строка, представляющая собой последовательность шестнадцатеричных пар с ведущим #. Шестнадцатеричная строка проверяется с использованием:

#(?:[\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})*"))*)*$

Проверьте это здесь

1 голос
/ 16 февраля 2012

Это не только невозможно, это никогда не сработает и даже не должно быть предпринято.Данные LDAP (в данном случае отличительное имя) не являются строками.Отличительное имя имеет синтаксис distinguishedName, который не является строкой, и сравнение должно выполняться с использованием правил сопоставления, определенных в схеме сервера каталогов.По этой причине регулярные выражения и операции сравнения на родном языке, относительные значения и операции равенства, такие как perl's ~~, eq и == и Java ==, не могут использоваться с данными LDAP - если программист попытается это сделать, неожиданнорезультаты могут быть получены, а код хрупок, хрупок, непредсказуем и не имеет повторяемых характеристик.Языковые API-интерфейсы LDAP, которые не поддерживают правила сопоставления , не могут использоваться с LDAP, где требуются сравнения, проверки на равенство и сравнения порядка относительных значений.

В качестве примера, выделенные имена "dc=example,dc=com "и" DC=example, DC=COM "во всех отношениях эквивалентны с точки зрения LDAP, но операторы равенства родного языка вернут false.

0 голосов
/ 26 мая 2014

Это сработало для меня:

Выражение:

^(?<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 и ограничению разрешенных символов, чтобы они точно соответствовали тому, что разрешено или запрещено. Но я считаю, что это хорошее начало.

0 голосов
/ 22 февраля 2012

Я создал один. Работает отлично.

^(\w+[=]{1}\w+)([,{1}]\w+[=]{1}\w+)*$
...