【发布时间】:2008-12-10 15:31:22
【问题描述】:
我想从下面的字符串中提取“James\, Brown”,但我并不总是知道名字是什么。逗号让我有些困惑,那么你建议如何提取 James\,Brown?
OU=James\, Brown,OU=Test,DC=Internal,DC=Net
谢谢
【问题讨论】:
-
太糟糕了,您无法获得用于以结构化格式提供输出的 API。解析很烦人。
我想从下面的字符串中提取“James\, Brown”,但我并不总是知道名字是什么。逗号让我有些困惑,那么你建议如何提取 James\,Brown?
OU=James\, Brown,OU=Test,DC=Internal,DC=Net
谢谢
【问题讨论】:
正则表达式可能是您最好的方法
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;
}
【讨论】:
您可以使用正则表达式:
string input = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net";
Match m = Regex.Match(input, "^OU=(.*?),OU=.*$");
Console.WriteLine(m.Groups[1].Value);
【讨论】:
一个非常脆弱的方法可能是......
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);
我不一定会提倡这种方法,但我刚从部门圣诞午餐回来,我的大脑还没有完全投入。
【讨论】:
我会从一个正则表达式开始拆分组:
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];
【讨论】:
如果斜线始终存在,我会考虑使用 RegEx 进行匹配,您可以使用匹配组来表示姓氏和名字。
^OU=([a-zA-Z])\,\s([a-zA-Z])
RegEx 将匹配仅包含字符的名称,您需要对其进行一些改进以便更好地匹配非标准名称。如果你走这条路,Here is a RegEx tester 会一路帮助你。
【讨论】:
用您自己喜欢的魔法字符串(可能是 & #44;)替换 \,拆分剩余的逗号或搜索到第一个逗号,然后用单个逗号替换您的魔法字符串。
即比如:
string originalStr = @"OU=James\, Brown,OU=Test,DC=Internal,DC=Net";
string replacedStr = originalStr.Replace("\,", ",");
string name = replacedStr.Substring(0, replacedStr.IndexOf(","));
Console.WriteLine(name.Replace(",", ","));
【讨论】:
假设您在 Windows 中运行,请将 PInvoke 与 DsUnquoteRdnValueW 结合使用。代码见我对另一个问题的回答:https://stackoverflow.com/a/11091804/628981
【讨论】:
如果格式始终相同:
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);
如果语法不完全正确,请原谅 - 凭记忆。显然,这不是很健壮,如果格式发生变化,它就会失败。
【讨论】: