C # Извлечение имени из строки - PullRequest
3 голосов
/ 10 декабря 2008

Я хочу извлечь «Джеймс \, Браун» из строки ниже, но я не всегда знаю, как будет называться это имя. Запятая вызывает у меня некоторые затруднения, так что бы вы предложили извлечь Джеймса, Брауна?

OU = Джеймс \, Браун, OU = Тест, DC = Внутренний, DC = Чистый

Спасибо

Ответы [ 9 ]

8 голосов
/ 10 декабря 2008

регулярное выражение, скорее всего, ваш лучший подход

static string ParseName(string arg) {
    var regex = new Regex(@"^OU=([a-zA-Z\\]+\,\s+[a-zA-Z\\]+)\,.*$");
    var match = regex.Match(arg);
    return match.Groups[1].Value;
}
4 голосов
/ 10 декабря 2008

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

string input = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net";
Match m = Regex.Match(input, "^OU=(.*?),OU=.*$");
Console.WriteLine(m.Groups[1].Value);   
2 голосов
/ 10 декабря 2008

Довольно хрупкий способ сделать это может быть ...

string name = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net";
string[] splitUp = name.Split("=".ToCharArray(),3);
string namePart = splitUp[1].Replace(",OU","");
Console.WriteLine(namePart);

Я бы не стал защищать этот метод, но я только что вернулся с рождественского обеда в департаменте, и мой мозг еще не полностью задействован.

1 голос
/ 10 декабря 2008

Это выглядит подозрительно как отличительное имя LDAP или Active Directory, отформатированное в соответствии с RFC 2253 / 4514 .

Если вы не работаете с хорошо известными именами и / или не разбираетесь в хрупком взломе (например, в решениях регулярных выражений) - тогда вам следует начать с чтения спецификации.

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

1 голос
/ 10 декабря 2008

Я бы начал с регулярного выражения, чтобы разделить группы:

    Regex rx = new Regex(@"(?<!\\),");
    String test = "OU=James\\, Brown,OU=Test,DC=Internal,DC=Net";
    String[] segments = rx.Split(test);

Но оттуда я бы разделил параметры в массиве, разделив их вручную, чтобы вам не приходилось использовать регулярное выражение, зависящее больше от используемого символа разделителя. Так как это похоже на запрос LDAP, это может не иметь значения, если вы всегда смотрите на params [0], но есть вероятность, что имя может быть установлено как «CN =». Вы можете охватить оба случая, просто прочитав запрос следующим образом:

    String name = segments[0].Split('=', 2)[1];
0 голосов
/ 21 ноября 2012

Если вы работаете в Windows, используйте PInvoke с DsUnquoteRdnValueW. Код см. В моем ответе на другой вопрос: https://stackoverflow.com/a/11091804/628981

0 голосов
/ 10 декабря 2008

Замените \ своей предпочитаемой магической строкой (возможно, & # 44;), разделите оставшиеся запятые или выполните поиск до первой запятой, затем замените магическую строку одной запятой.

т.е. Что-то вроде:

string originalStr = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net";
string replacedStr = originalStr.Replace("\,", "&#44;");

string name = replacedStr.Substring(0, replacedStr.IndexOf(","));
Console.WriteLine(name.Replace("&#44;", ","));
0 голосов
/ 10 декабря 2008

Если косая черта всегда присутствует, я бы посмотрел на потенциальное использование RegEx для сопоставления, вы можете использовать группу совпадений для фамилии и имени.

* * * Тысяча два OU = ([A-Za-Z] ) \, \ с ([A-Za-Z] )

Чтобы RegEx совпадал с именами, содержащими только символы, вам нужно немного его уточнить для лучшего соответствия нестандартным именам. Вот тестер RegEx , который поможет вам на этом пути, если вы пойдете по этому маршруту.

0 голосов
/ 10 декабря 2008

Если формат всегда один и тот же:

string line = GetStringFromWherever();

int start = line.IndexOf("=") + 1;//+1 to get start of name
int end = line.IndexOf("OU=",start) -1; //-1 to remove comma

string name = line.Substring(start, end - start);

Простите, если синтаксис не совсем правильный - из памяти. Очевидно, что это не очень надежно и дает сбой, если формат когда-либо меняется.

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...