String-parsing-fu: Можете ли вы помочь мне найти способ получить это значение? - PullRequest
1 голос
/ 23 марта 2011

Мне нужно как-то определить, есть ли значение родительского OU и есть ли его получение.

Например, здесь нет родителя:

LDAP://servera/OU=Santa Cruz,DC=contoso,DC=com

Но здесь есть родитель:

LDAP://servera/OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com

Так что мне нужно получить этот "Ventas""string.

Другой пример:

LDAP://servera/OU=Contabilidad,OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com

Мне нужно будет также извлечь эту строку" Ventas " .

Любые предложения о том, какзаняться этим?

Ответы [ 3 ]

2 голосов
/ 23 марта 2011
string ldap = "LDAP://servera/OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com";
Match match = Regex.Match(ldap, @"LDAP://\w+/OU=(?<toplevelou>\w+?),OU=");
if(match.Success)
{
    Console.WriteLine(match.Result("${toplevelou}"));
}
2 голосов
/ 23 марта 2011

Назовите меня сумасшедшим, но я бы сделал это так (эй, ма, смотри, однострочник!):

var str = "LDAP://servera/OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com";
var result = str.Substring(str.LastIndexOf('/') + 1).Split(',')
                .Select(s => s.Split('='))
                .Where(a => a[0] == "OU")
                .Select(a => a[1])
                .Reverse().Skip(1).FirstOrDefault();

result либо null, либо содержит строку, которую вы хотите. Это будет работать независимо от того, сколько OU s там и будет возвращать второй до последнего, если формат строки действителен с самого начала.

Обновление: возможные улучшения:

Вышеуказанное не будет работать правильно, если в вашем DN есть экранированная косая черта или экранированная запятая.

Чтобы исправить это, вам нужно использовать регулярные выражения. Изменения:

str.Substring(str.LastIndexOf('/') + 1).Split(',')

до:

Regex.Split(Regex.Split(str, "(?<!\\\\)/").Last(), "(?<!\\\\),")

Для этого нужно отделить DN, получив последнюю часть str после разделения на косую черту, и разделить DN на части, разделив запятые. В обоих случаях используется отрицательный вид сзади, чтобы убедиться, что косые черты / запятые не экранированы.

Не так красиво, я знаю. Но это все еще однострочный текст (yay!), И он все еще позволяет вам использовать LINQ ниже для обработки нескольких OU s любым способом, который вы выберете.

2 голосов
/ 23 марта 2011

Я найду первое вхождение OU=... и получу его значение.Тогда я бы проверил, было ли другое событие после этого.Если так, верните полученное мной значение.Если нет, вернуть все, что вы хотите, если нет родителя (String.Empty, или, null, или что-то еще).

Вы также можете использовать регулярное выражение, например:

var regex = new Regex(@"OU=(.*?),");
var matches = regex.Matches(ldapString);

Затем проверьте, сколько совпадений.Если> 1, вернуть захваченное значение из первого совпадения.

Обновить

Приведенное выше регулярное выражение необходимо улучшить, чтобы допустить случай, когда есть запятая (\,) в строке LDAP.Может быть что-то вроде:

var regex = new Regex(@"OU=((.*?(\\\,)+?)+?),");

Это может быть сломано, и может быть более простой способ сделать то же самое.Я не волшебник регулярных выражений.

Другое обновление

Согласно комментарию Кимберли ниже регулярного выражения должно быть @"OU=((?:.*?(?:\\\,)*?)+?),".

...