C # Извлечение имени из строки

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

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

Спасибо

10.12.2008 15:31:22
Жаль, что вы не можете получить API, который вы используете, чтобы получить вывод в структурированном формате. Разбор утомительный.
Jay Bazuzi 10.12.2008 16:08:25
9 ОТВЕТОВ

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

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);

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

0
1.07.2019 22:36:19
На самом деле вторым параметром SubString является длина, а не endIndex. В вашем примере это ДОЛЖНО быть name = line.SubString (start, end - start). Я всегда ненавидел это в Substring, и именно поэтому я создал методы расширения, которые разрешают startIndex и endIndex.
BFree 10.12.2008 15:41:06
xan - я отредактировал правильный синтаксис, так как перед машиной с установленным Snippetcompiler. :)
ZombieSheep 10.12.2008 15:45:23

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

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);

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

2
10.12.2008 15:36:38
Привет, меня зовут "Foo, OUBar", но вы можете называть меня "FooBar" ;-)
VVS 10.12.2008 16:26:16

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

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;
}
8
10.12.2008 15:43:37
Хороший подход, но у меня есть иррациональный страх. :)
ZombieSheep 10.12.2008 15:46:24
Но для того, чтобы сделать это, я должен признать, что мой страх неправ, и как йоркширский житель, я никогда не ошибаюсь. ;-)
ZombieSheep 10.12.2008 15:49:22
Вы предполагаете, что у каждого имени есть запятая, которая может быть неправильной (и, вероятно, есть).
VVS 10.12.2008 16:20:09
@ Дэвид, спрашивающий не упомянул об этом так или иначе, поэтому все, что я могу сделать, это то, что они задают в вопросе. Я также мог бы задаться вопросом, допускаются ли @ в названии. Или, возможно, 3 имени против 2. Но еще раз, если спрашивающий не помещает это в свой вопрос, предположения необходимы.
JaredPar 10.12.2008 16:23:36
@Jared: я просто указываю на потенциальную ошибку, которая может появиться в рабочем коде через 2 года ;-). Тем не менее, представленный пример выглядит действительно как LDAP DN, поэтому я предпочитаю ответ Марка Брэкетта.
VVS 10.12.2008 16:31:40

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

^ OU = ([a-zA-Z] ) \, \ s ([a-zA-Z] )

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

0
10.12.2008 15:47:40

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

string input = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net";
Match m = Regex.Match(input, "^OU=(.*?),OU=.*$");
Console.WriteLine(m.Groups[1].Value);   
4
10.12.2008 16:02:21

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

    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];
1
10.12.2008 16:03:08

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

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

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

1
10.12.2008 16:14:00

Замените \ своей предпочитаемой магической строкой (возможно, & # 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.12.2008 16:27:01

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

0
23.05.2017 12:16:09