Назовите меня сумасшедшим, но я бы сделал это так (эй, ма, смотри, однострочник!):
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 любым способом, который вы выберете.